написать собственный Spring PayloadTransformer и загрузить его - PullRequest
0 голосов
/ 07 января 2019

В настоящее время я работаю с citrus-framework для тестирования приложения. Один из моих интерфейсов использует Protobuf, и я хотел бы реализовать преобразователь protobuf-to-json, который совместим с пружинной интеграцией, чтобы использовать его аналогично следующему, но с моим преобразователем вместо преобразователя объект-в-строку:

<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>

на данный момент у меня есть прототип в точности как объект-строка-преобразователь , и я загружаю его с помощью:

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

но это не удалось.

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?

У кого-нибудь есть идея или подсказка, где искать в Интернете?

BR

1 Ответ

0 голосов
/ 07 января 2019

Это верно. Вам действительно нужно следовать дизайну в ObjectToStringTransformer, чтобы реализовать свой собственный AbstractPayloadTransformer. И это должно быть как простое определение <bean> в контексте вашего приложения.

Только проблема в том, что вы не понимаете, почему у нас действительно есть все эти пользовательские теги для использования атрибутов input-channel и output-channel. Дело в том, что это <int:object-to-string-transformer>, например, предоставляет для контекста приложения несколько bean-компонентов, включая упомянутый экземпляр ObjectToStringTransformer, MessageTransformingHandler и, наконец, ConsumerEndpointFactoryBean для соединения MessageHandler с inputChannel .

Итак, здесь вам не хватает общего определения <int:transformer> для вашей пользовательской AbstractPayloadTransformer реализации:

<bean id="Proto2Json" class="com.nobody.citrus.transformer.ProtoToJSONString"/>

<int:tranformer ref="Proto2Json" input-channel="configRawReplies" output-channel="configResponse"/>

Пожалуйста, прочтите Справочное руководство, чтобы избежать подобных обсуждений в будущем:

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

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

...