Spring集成,如何使用@Transformer从/到JSON转换?

Max*_* Wu 2 json annotations spring-integration

我的问题是如何在 SI 端点之间传递对象?

我发现的几乎每个示例都使用 XML 设置,我使用的是 Annotation 并且不知道如何解决此异常

Caused by: java.lang.IllegalArgumentException: Could not resolve 'json__TypeId__' in 'javaTypes'.
    at org.springframework.integration.support.json.AbstractJacksonJsonObjectMapper.createJavaType(AbstractJacksonJsonObjectMapper.java:68)
    at org.springframework.integration.support.json.Jackson2JsonObjectMapper.extractJavaType(Jackson2JsonObjectMapper.java:116)
    at org.springframework.integration.support.json.Jackson2JsonObjectMapper.extractJavaType(Jackson2JsonObjectMapper.java:52)
    at org.springframework.integration.support.json.AbstractJacksonJsonObjectMapper.fromJson(AbstractJacksonJsonObjectMapper.java:61)
    at org.springframework.integration.json.JsonToObjectTransformer.doTransform(JsonToObjectTransformer.java:87)
    at org.springframework.integration.transformer.AbstractTransformer.transform(AbstractTransformer.java:33)
    ... 18 more
Run Code Online (Sandbox Code Playgroud)

人们建议使用 xml 来解决这个问题,例如

<bean class="org.springframework.amqp.support.converter.DefaultClassMapper">
    <property name="defaultType" value="foo.MyObject" />
</bean>
Run Code Online (Sandbox Code Playgroud)

但是我正在使用注释来创建转换器来处理从通道接收的消息,就像这样

    @Bean
    @Transformer(inputChannel="fromTcp", outputChannel="toHandler")
    JsonToObjectTransformer jsonToObjectTransformer() {
        ObjectMapper mapper = new ObjectMapper();       
        JsonObjectMapper<JsonNode, JsonParser> jm = new Jackson2JsonObjectMapper(mapper);
        return new JsonToObjectTransformer(jm);
    }
Run Code Online (Sandbox Code Playgroud)

实际上我不知道如何在 SI 端点之间传递对象。我只能通过 String 和 SI 使用默认序列化来处理 String 到 byte[],以及 byte[] 到 String。

Gar*_*ell 5

转换器需要知道要转换成什么类型​​;你得到的错误是因为你没有提供类型,所以它回退到寻找包含类型信息的标头。

xml 的等价物是:

@Bean
@Transformer(inputChannel="fromTcp", outputChannel="toHandler")
JsonToObjectTransformer jsonToObjectTransformer() {
    return new JsonToObjectTransformer(MyObject.class);
}
Run Code Online (Sandbox Code Playgroud)