From fd0d6e1c31549f9be853e9fa01ec350f967d5698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9A=E4=BD=99=E5=B8=83=E9=81=93=E5=B8=88?= Date: Wed, 20 Apr 2022 16:09:19 +0800 Subject: [PATCH 1/3] support for spring messaging converter. --- .../MappingFastJsonMessageConverter.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 extension/src/main/java/com/alibaba/fastjson2/support/spring/messaging/converter/MappingFastJsonMessageConverter.java diff --git a/extension/src/main/java/com/alibaba/fastjson2/support/spring/messaging/converter/MappingFastJsonMessageConverter.java b/extension/src/main/java/com/alibaba/fastjson2/support/spring/messaging/converter/MappingFastJsonMessageConverter.java new file mode 100644 index 0000000000..f69f86b642 --- /dev/null +++ b/extension/src/main/java/com/alibaba/fastjson2/support/spring/messaging/converter/MappingFastJsonMessageConverter.java @@ -0,0 +1,94 @@ +package com.alibaba.fastjson2.support.spring.messaging.converter; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.support.config.FastJsonConfig; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.converter.AbstractMessageConverter; +import org.springframework.util.MimeType; + +import java.nio.charset.Charset; + +/** + * Fastjson for Spring Messaging Json Converter. + * + * @author KimmKing + * @author Victor.Zxy + * @see AbstractMessageConverter + * @since 2.0.2 + */ +public class MappingFastJsonMessageConverter extends AbstractMessageConverter { + + /** + * with fastJson config + */ + private FastJsonConfig fastJsonConfig = new FastJsonConfig(); + + /** + * @return the fastJsonConfig. + */ + public FastJsonConfig getFastJsonConfig() { + return fastJsonConfig; + } + + /** + * @param fastJsonConfig the fastJsonConfig to set. + */ + public void setFastJsonConfig(FastJsonConfig fastJsonConfig) { + this.fastJsonConfig = fastJsonConfig; + } + + public MappingFastJsonMessageConverter() { + super(new MimeType("application", "json", Charset.forName("UTF-8"))); + } + + @Override + protected boolean supports(Class clazz) { + return true; + } + + @Override + protected boolean canConvertFrom(Message message, Class targetClass) { + return supports(targetClass); + } + + @Override + protected boolean canConvertTo(Object payload, MessageHeaders headers) { + return supports(payload.getClass()); + } + + @Override + protected Object convertFromInternal(Message message, Class targetClass, Object conversionHint) { + // parse byte[] or String payload to Java Object + Object payload = message.getPayload(); + Object obj = null; + if (payload instanceof byte[]) { + obj = JSON.parseObject((byte[]) payload, targetClass, fastJsonConfig.getReaderFeatures()); + } else if (payload instanceof String) { + obj = JSON.parseObject((String) payload, targetClass, fastJsonConfig.getReaderFeatures()); + } + + return obj; + } + + @Override + protected Object convertToInternal(Object payload, MessageHeaders headers, Object conversionHint) { + // encode payload to json string or byte[] + Object obj; + if (byte[].class == getSerializedPayloadClass()) { + if (payload instanceof String && JSON.isValid((String) payload)) { + obj = ((String) payload).getBytes(fastJsonConfig.getCharset()); + } else { + obj = JSON.toJSONBytes(payload, fastJsonConfig.getWriterFilters(), fastJsonConfig.getWriterFeatures()); + } + } else { + if (payload instanceof String && JSON.isValid((String) payload)) { + obj = payload; + } else { + obj = JSON.toJSONString(payload, fastJsonConfig.getWriterFilters(), fastJsonConfig.getWriterFeatures()); + } + } + + return obj; + } +} From 3628b654497421b2514f0f503f124980dc4d4f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9A=E4=BD=99=E5=B8=83=E9=81=93=E5=B8=88?= Date: Wed, 20 Apr 2022 16:10:07 +0800 Subject: [PATCH 2/3] add testcase for spring messaging converter. --- .../MappingFastJsonMessageConverterTest.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 extension/src/test/java/com/alibaba/fastjson2/spring/MappingFastJsonMessageConverterTest.java diff --git a/extension/src/test/java/com/alibaba/fastjson2/spring/MappingFastJsonMessageConverterTest.java b/extension/src/test/java/com/alibaba/fastjson2/spring/MappingFastJsonMessageConverterTest.java new file mode 100644 index 0000000000..89494303a6 --- /dev/null +++ b/extension/src/test/java/com/alibaba/fastjson2/spring/MappingFastJsonMessageConverterTest.java @@ -0,0 +1,90 @@ +package com.alibaba.fastjson2.spring; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.support.config.FastJsonConfig; +import com.alibaba.fastjson2.support.spring.messaging.converter.MappingFastJsonMessageConverter; +import org.junit.Assert; +import org.junit.jupiter.api.Test; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; + + +public class MappingFastJsonMessageConverterTest { + + @Test + public void test_1() throws Exception { + + MappingFastJsonMessageConverter converter = new MappingFastJsonMessageConverter(); + + Assert.assertNotNull(converter.getFastJsonConfig()); + converter.setFastJsonConfig(new FastJsonConfig()); + + VO p = new VO(); + p.setId(1); + + String pstr = JSON.toJSONString(p); + + System.out.println(pstr); + + TestMessage message = new TestMessage(pstr); + + // test fromMessage/convertFromInternal + VO vo = (VO) converter.fromMessage(message, VO.class); + Assert.assertEquals(1, vo.getId()); + + // test toMessage/convertToInternal + Message message1 = converter.toMessage(vo, null); + System.out.println(message1.getPayload()); + Assert.assertEquals("{\"id\":1}", new String((byte[]) message1.getPayload())); + +// // test toMessage/convertToInternal + Message message2 = converter.toMessage("{\"id\":1}", null); + System.out.println(message2.getPayload()); + Assert.assertEquals("{\"id\":1}", new String((byte[]) message2.getPayload())); + + converter.setSerializedPayloadClass(String.class); + + // test toMessage/convertToInternal + Message message3 = converter.toMessage(vo, null); + System.out.println(message3.getPayload()); + Assert.assertEquals("{\"id\":1}", message3.getPayload()); + +// // test toMessage/convertToInternal + Message message4 = converter.toMessage("{\"id\":1}", null); + System.out.println(message4.getPayload()); + Assert.assertEquals("{\"id\":1}", message4.getPayload()); + } + + public static class TestMessage implements Message { + + private T payload; + + public TestMessage(T payload) { + this.payload = payload; + } + + @Override + public T getPayload() { + return (T) payload; + } + + @Override + public MessageHeaders getHeaders() { + return null; + } + } + + public static class VO { + + private int id; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + } +} \ No newline at end of file From f1e657fc65c0c96fc2a22b119574f5b7c3bf5afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9A=E4=BD=99=E5=B8=83=E9=81=93=E5=B8=88?= Date: Wed, 20 Apr 2022 17:41:01 +0800 Subject: [PATCH 3/3] add dependency spring-messaging. --- extension/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/extension/pom.xml b/extension/pom.xml index 9fb2d080f7..d5b6c0706f 100644 --- a/extension/pom.xml +++ b/extension/pom.xml @@ -64,6 +64,13 @@ provided + + org.springframework + spring-messaging + 5.2.20.RELEASE + provided + + org.springframework spring-test