Свойства jsonignore интеграции 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 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?

0
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Совершенно непонятно, как эта тема @JsonIgnoreProperties связана с исключением о неправильном выражении SpEL, но я оставляю это на ваше усмотрение.

Итак, что мы имеем на данный момент:

  1. 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 в выражении как ссылку на эти геттеры корневого объекта.

  1. Полезная нагрузка в вашем — это Posts объект. Что на самом деле не является списком, массивом или даже картой для выполнения над ним оператора [] (индекс).

  2. Чтобы получить доступ к этим 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, но теперь все работает, как я и ожидал.

uyuola 10.12.2020 16:44

Другие вопросы по теме