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

C0d*_*ack 2 spring-integration jackson

我正在使用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"/>
Run Code Online (Sandbox Code Playgroud)

我的消息相关对象是:

MyMessage.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class MyMessage {

    @JsonProperty
    private String timestamp;

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

    // Getters and Setters...
}
Run Code Online (Sandbox Code Playgroud)

Message.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class Message {

    @JsonProperty
    private Integer msgId;

    @JsonProperty("msgText")
    private String text;

    // Getters and Setters...
}
Run Code Online (Sandbox Code Playgroud)

当json转换器尝试将消息转换为对象时,它将失败

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

JSON有效负载肯定有msgs一个数组,其中包含表示Message.java类的对象.

任何人都可以提出为什么会发生异常的原因,因为JSON具有被抱怨的字段,并且类本身也被注释为忽略未知字段?

更新 经过一些调试之后@JsonProperty("msgs"),出于某种原因看起来注释没有被使用.

Gar*_*ell 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());
}
Run Code Online (Sandbox Code Playgroud)

(我稍微改变了你的类名以避免碰撞Message<?>)

导致...

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

你是否在类路径上有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;
Run Code Online (Sandbox Code Playgroud)