Spring Integration:JSON请求场景下是否有类似SoapMessageDispatcher的默认MessageDispatcher?
首先得明确:Spring Web Services(Spring WS)本身并没有提供像org.springframework.ws.soap.server.SoapMessageDispatcher那样专门处理JSON请求的默认MessageDispatcher实现——毕竟Spring WS的核心定位就是围绕XML和SOAP协议构建的。不过你完全可以通过以下几种方式实现需求,让MessageDispatcher顺利接管JSON格式的请求:
1. 自定义JSON版的WebServiceMessage体系
这是最直接的方案:你需要为JSON payload打造一套适配Spring WS的消息处理类,包括WebServiceMessage实现、对应的WebServiceMessageFactory,让Spring能把JSON请求转换成MessageDispatcher能识别的消息格式。
举个简单的代码示例:
// 自定义JSON消息类,实现WebServiceMessage接口 public class JsonWebServiceMessage implements WebServiceMessage { private String jsonContent; // 实现WebServiceMessage的所有方法,比如获取payload输入流、输出流等 @Override public Source getPayloadSource() { // 这里可以自定义Source来封装JSON,或者转换成DOM Source(如果需要和现有XML端点兼容) return new StreamSource(new StringReader(jsonContent)); } @Override public Result getPayloadResult() { return new StreamResult(new StringWriter()); } // 其他接口方法的实现... public void setJsonContent(String jsonContent) { this.jsonContent = jsonContent; } } // 自定义消息工厂,负责创建JsonWebServiceMessage实例 public class JsonWebServiceMessageFactory implements WebServiceMessageFactory { @Override public JsonWebServiceMessage createWebServiceMessage() { return new JsonWebServiceMessage(); } @Override public JsonWebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { JsonWebServiceMessage message = new JsonWebServiceMessage(); message.setJsonContent(new String(inputStream.readAllBytes(), StandardCharsets.UTF_8)); return message; } }
然后在Spring配置里替换默认的消息工厂,让WebServiceMessageReceiverHandlerAdapter使用它:
<bean id="jsonMessageFactory" class="com.yourpackage.JsonWebServiceMessageFactory"/> <bean class="org.springframework.ws.server.endpoint.adapter.WebServiceMessageReceiverHandlerAdapter"> <property name="messageFactory" ref="jsonMessageFactory"/> </bean>
2. 用Spring MVC消息转换器做格式中转
如果不想完全从零构建JSON消息体系,可以借助Spring MVC成熟的JSON处理能力做中转:
- 先自定义一个HandlerAdapter,先用
MappingJackson2HttpMessageConverter把JSON请求解析成Java对象 - 再把这个Java对象序列化成XML格式,封装成Spring WS原生的
SaajSoapMessage - 最后把XML消息交给
MessageDispatcher处理,这样就能复用现有的XML端点逻辑
这种方案适合那些已经有XML端点,想快速支持JSON请求的场景。
3. 考虑是否真的需要MessageDispatcher
最后提个小建议:如果你的核心需求只是处理JSON请求并做业务逻辑分发,Spring MVC的RequestMappingHandlerAdapter配合@RestController其实是更自然的选择——毕竟它原生支持JSON,配置简单。但如果因为项目架构限制必须用MessageDispatcher,那前两种方案就更适合你。
另外要注意:MessageDispatcher是通过EndpointMapping来匹配端点的,所以处理JSON时,你可能还需要自定义EndpointMapping,比如根据JSON里的某个字段(比如action)来匹配对应的端点,就像SOAP通过SOAPAction头匹配一样。
内容的提问来源于stack exchange,提问作者Sowmya Poovannan

