2

Spring Integration を使用して、JSON ペイロードでメッセージを消費しています。

私の春の文脈では、私は持っています

<integration:channel id="jsonToMyMessageConverterChannel"/>
<integration:json-to-object-transformer 
    type="com.acme.messaging.message.MyMessage"
    input-channel="jsonToMyMessageConverterChannel"
    output-channel="myMessageUpdateChannel"/>

私のメッセージ関連のオブジェクトは次のとおりです。

MyMessage.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class MyMessage {

    @JsonProperty
    private String timestamp;

    @JsonProperty("msgs")
    private List<Message> messages;

    // Getters and Setters...
}

メッセージ.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class Message {

    @JsonProperty
    private Integer msgId;

    @JsonProperty("msgText")
    private String text;

    // Getters and Setters...
}

json トランスフォーマーがメッセージをオブジェクトに変換しようとすると、失敗します。

Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "msgs" (Class com.acme.messaging.message.MyMessage), not marked as ignorable

JSON ペイロードには、クラスmsgsを表すオブジェクトを含む配列が確実に含まれています。Message.java

JSON に問題のあるフィールドがあり、クラス自体にも不明なフィールドを無視するように注釈が付けられている場合、例外が発生する理由を誰かが提案できますか?

更新 デバッグ後@JsonProperty("msgs")、何らかの理由で注釈が使用されていないようです。

4

1 に答える 1

5

これは私にとってはうまくいきます...

@Test
public void test() throws Exception {
    MyMessages mm = new MyMessages();
    MyMessage m = new MyMessage();
    m.setMsgId(1);
    m.setText("foo");
    mm.setMessages(Arrays.asList(m));
    mm.setTimestamp("123");
    @SuppressWarnings("deprecation")
    ObjectToJsonTransformer otjt = new ObjectToJsonTransformer(new ObjectMapper());
    Message<?> message = new GenericMessage<MyMessages>(mm);
    message = otjt.transform(message);
    System.out.println(message);
    @SuppressWarnings("deprecation")
    JsonToObjectTransformer<MyMessages> jtot = new JsonToObjectTransformer<MyMessages>(MyMessages.class, new ObjectMapper());
    message = jtot.transform(message);
    mm = (MyMessages) message.getPayload();
    System.out.println(mm.getTimestamp());
    System.out.println(mm.getMessages().get(0).getText());
}

( との衝突を避けるために、クラス名を少し変更しましたMessage<?>)

その結果...

[Payload={"timestamp":"123","msgs":[{"msgId":1,"msgText":"foo"}]}][Headers={timestamp=1373997151738, id=f2425f36-a500-4aee-93a4-e7e0240ce0f1, content-type=application/json}]
123
foo

クラスパスに jackson 1.x (codehaus) と 2.x (fasterxml) の両方があり、Spring Integration 3.0.0 を使用していますか?

それらが両方ともクラスパスにある場合、SI はデフォルトで Jackson 2.x を使用します (これは 1.x アノテーションを認識しません)。

それとも、Jackson2 (fasterxml) アノテーションを使用していますか? Spring Integration 2.x は Jackson 1 (codehaus) を使用します。

編集:

Jackson の両方のバージョンをサポートするために、クラスに両方の注釈を付けることができます...

    @JsonProperty("msgs")
    @com.fasterxml.jackson.annotation.JsonProperty("msgs")
    public List<MyMessage> messages;
于 2013-07-16T17:57:40.487 に答える