杰克逊没有识别出场异常但是场是JSON

时间:2013-07-16 16:21:30

标签: jackson spring-integration

我正在使用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...
}

Message.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")注释。

1 个答案:

答案 0 :(得分: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;