свойства spring integration jsonignore

#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 тема связана с исключением о неправильном выражении орфографии, но я оставляю это на ваше усмотрение.

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

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

  1. Полезная нагрузка в вашем — это этот Posts объект. На самом деле это не список, не массив и даже не карта, чтобы выполнять [] над ней оператор (index).
  2. Чтобы получить доступ к 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 , но теперь все работает так, как я ожидал.