2

我正在使用 Spring Integration 来使用带有 JSON Payload 的消息。

在我的春天背景下,我有

<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 回答