Search code examples
spring-integrationcitrus-framework

write own Spring PayloadTransformer and load it


I'm currently working with citrus-framework to test an application. One of my interfaces uses Protobuf and I would like to implement a protobuf-to-json-transformer which is compatible with spring-integration to use it similarly like the following but with my transformer instead of the object-to-string-transformer:

<int:channel id="configRawReplies" />

<int:object-to-string-transformer id="configtransformer" input-channel="configRawReplies" output-channel="configResponse" />

<int:channel id="configResponse">
    <int:queue />
</int:channel>

for now I have a prototyp exactly like object-to-string-transformer and I'm loading it with:

<bean id="Proto2Json" class="com.nobody.citrus.transformer.ProtoToJSONString">
    <property name="input-channel" value="none"/>
    <property name="output-channel" value="none"/>
</bean>

but it fails.

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Proto2Json' defined in URL [file:/Users/nobody/DevOops/test/citrus-scala/target/test-classes/citrus-context.xml]: 
Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: 
Invalid property 'input-channel' of bean class [com.pme.citrus.transformer.ProtoToJSONString]: 
Bean property 'input-channel' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

Does somebody have an idea or an hint where to look on the web?

BR


Solution

  • That's correct. You really need to follow a design in the ObjectToStringTransformer to implement your own AbstractPayloadTransformer. And that one has to be as a plain <bean> definition in your application context.

    Only the problem that you don't understand why we really have all those custom tags to utilize input-channel and output-channel attributes as well. The point is that this <int:object-to-string-transformer>, for example, provides for the application context several beans, including the mentioned ObjectToStringTransformer instance, a MessageTransformingHandler and, finally, ConsumerEndpointFactoryBean to connect a MessageHandler with an inputChannel.

    So, what you are missing here is a generic <int:transformer> definition for your custom AbstractPayloadTransformer implementation:

    <bean id="Proto2Json" class="com.nobody.citrus.transformer.ProtoToJSONString"/>
    
    <int:tranformer ref="Proto2Json" input-channel="configRawReplies" output-channel="configResponse"/>
    

    Please, read more Reference Manual to avoid similar discussions in the future:

    https://docs.spring.io/spring-integration/reference/html/overview.html#programming-tips

    https://docs.spring.io/spring-integration/reference/html/messaging-transformation-chapter.html