Я пытаюсь игнорировать некоторую информацию 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 result;
}
}
И тут я пытаюсь их вставить.
<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?
Совершенно непонятно, как эта тема @JsonIgnoreProperties связана с исключением о неправильном выражении SpEL, но я оставляю это на ваше усмотрение.
Итак, что мы имеем на данный момент:
Spring Integration в частях выражения имеет дело с Message как с корневым объектом контекста оценки. У 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 и payload в выражении как ссылку на эти геттеры корневого объекта.
Полезная нагрузка в вашем — это Posts объект. Что на самом деле не является списком, массивом или даже картой для выполнения над ним оператора [] (индекс).
Чтобы получить доступ к этим title и author, вам просто нужно следовать правилу получения в SpEL. Поэтому тот же простой оператор точки с именем свойства: values(:payload.title, :payload.author).
Если это не сработает, вам нужно подумать о внедрении ExpressionEvaluatingSqlParameterSourceFactory в этот <int-jdbc:outbound-channel-adapter> с псевдонимами имен параметров в целевые выражения.
Посмотрите некоторые идеи в проекте примеров: 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
Еще раз спасибо. Да, я напортачил с
@JsonIgnoreProperties, но теперь все работает, как я и ожидал.