我正在使用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")
注释。
答案 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;