> echo() {
+ return value -> MessageBuilder.withPayload(value.getPayload().toString())
+ .setHeader("expected-content-type", MimeTypeUtils.TEXT_PLAIN_VALUE)
+ .build();
+ }
+ }
+
+ public static class Employee {
+
+ private P person;
+
+ private int id;
+
+ public int getId() {
+ return this.id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public P getPerson() {
+ return this.person;
+ }
+
+ public void setPerson(P person) {
+ this.person = person;
+ }
+
+ }
+
+ public static class Person {
+
+ private String name;
+
+ public Person() {
+ this(null);
+ }
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+ }
+
+ @Configuration
+ public static class CustomConverters {
+
+ @Bean
+ public FooBarMessageConverter fooBarMessageConverter() {
+ return new FooBarMessageConverter(MimeType.valueOf("foo/bar"));
+ }
+
+ @Bean
+ public AlwaysStringKryoMessageConverter kryoOverrideMessageConverter() {
+ return new AlwaysStringKryoMessageConverter(
+ MimeType.valueOf("application/x-java-object"));
+ }
+
+ /**
+ * Even though this MessageConverter has nothing to do with Kryo it still shows
+ * how Kryo conversion can be customized/overriden since it simply overriding a
+ * converter for contentType 'application/x-java-object'.
+ *
+ */
+ public static class AlwaysStringKryoMessageConverter
+ extends AbstractMessageConverter {
+
+ public AlwaysStringKryoMessageConverter(MimeType supportedMimeType) {
+ super(supportedMimeType);
+ }
+
+ @Override
+ protected boolean supports(Class> clazz) {
+ return clazz == null || String.class.isAssignableFrom(clazz);
+ }
+
+ @Override
+ protected Object convertFromInternal(Message> message, Class> targetClass,
+ @Nullable Object conversionHint) {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ protected Object convertToInternal(Object payload,
+ @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
+ return ((String) payload).getBytes(StandardCharsets.UTF_8);
+ }
+
+ }
+
+ public static class FooBarMessageConverter extends AbstractMessageConverter {
+
+ protected FooBarMessageConverter(MimeType supportedMimeType) {
+ super(supportedMimeType);
+ }
+
+ @Override
+ protected boolean supports(Class> clazz) {
+ return clazz != null && String.class.isAssignableFrom(clazz);
+ }
+
+ @Override
+ protected Object convertFromInternal(Message> message, Class> targetClass,
+ @Nullable Object conversionHint) {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ protected Object convertToInternal(Object payload,
+ @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
+ return ((String) payload).getBytes(StandardCharsets.UTF_8);
+ }
+
+ }
+
+ }
+
+ @Import(TestChannelBinderConfiguration.class)
+ @EnableAutoConfiguration
+ public static class MapInputConfiguration {
+
+ @Bean
+ public Function