#spring #spring-integration
#spring #весенняя интеграция
Вопрос:
Я пытаюсь игнорировать некоторую информацию json, которую я получаю от JMS:
{"publishedDate":"2018","title":"How to","author":"rcade"}
Я использую @JsonIgnoreProperties
@JsonIgnoreProperties({"title", "author", "publishedDate"})
public class Posts {
@com.fasterxml.jackson.annotation.JsonIgnoreProperties({"publishedDate"})
private String title;
private String author;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
public class JsonToPojoTransformerBean {
public Posts transform(@org.jetbrains.annotations.NotNull Message message) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Posts result = mapper.readValue(message.getPayload().toString(), Posts.class);
return resu<
}
}
И затем я пытаюсь их вставить.
<int:transformer id="jsonToProdObjectTransformer" ref="JsonToPojoTransformerBean" input-channel="JmsInbound"
method="transform" output-channel="feed"/>
<int-jdbc:outbound-channel-adapter id="jdbcOutbound"
channel="feed"
data-source="dataSource"
query="INSERT INTO posts(title, author)
values(:payload[title], :payload[author])"/>
Но, как всегда, я получаю ошибки:
Invalid property 'payload[title]' of bean class [org.springframework.messaging.support.GenericMessage]: Illegal attempt to get property 'payload' threw exception; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'payload[title]' of bean class [org.springframework.messaging.support.GenericMessage]: Property referenced in indexed property path 'payload[title]' is neither an array nor a List nor a Set nor a Map; returned value was [com.example.Posts@76038c44]
Я впервые пробую это и почему это не работает как payload[title]
? Для чего мне нужно предоставить эти значения query
? Правильно ли я сделал это даже для игнорирования некоторой полезной нагрузки json?
Ответ №1:
Совершенно неясно, как эта @JsonIgnoreProperties
тема связана с исключением о неправильном выражении орфографии, но я оставляю это на ваше усмотрение.
Итак, то, что мы имеем на данный момент, это:
- Интеграция Spring в частях выражения имеет дело с
Message
корневым объектом контекста оценки as. УMessage
него есть контракт, подобный:public interface Message<T> { /** * Return the message payload. */ T getPayload(); /** * Return message headers for the message (never {@code null} but may be empty). */ MessageHeaders getHeaders(); }
поэтому мы можем headers
использовать and payload
в выражении в качестве ссылки на эти геттеры корневого объекта.
- Полезная нагрузка в вашем — это этот
Posts
объект. На самом деле это не список, не массив и даже не карта, чтобы выполнять[]
над ней оператор (index). - Чтобы получить доступ к
title
ним,author
вам просто нужно следовать правилу получения в SpEL. Поэтому тот же простой точечный оператор с именем свойства:values(:payload.title, :payload.author)
.
Если это не сработает, вам нужно подумать о том, чтобы ввести ExpressionEvaluatingSqlParameterSourceFactory
в <int-jdbc:outbound-channel-adapter>
него псевдонимы имен параметров для целевых выражений.
Посмотрите некоторые идеи в проекте samples: https://github.com/spring-projects/spring-integration-samples/tree/master/basic/jdbc .
Также документы дают некоторые пояснения: https://docs.spring.io/spring-integration/docs/current/reference/html/jdbc.html#jdbc-outbound-channel-adapter
Комментарии:
1. Еще раз спасибо вам. Да, я там напортачил
@JsonIgnoreProperties
, но теперь все работает так, как я ожидал.