美好的一天。我是春季集成的新手。我写了一个简单的SOAP服务器,我需要连接一个通过JSON进行通信的客户端和一个通过SOAP进行通信的服务器,但是我对该框架提供的技术感到困惑。据我了解,有JsonToObjectTransformer和ObjectToMapTransformer转换器。据我了解,有必要在将数据传输到控制器之前对其进行转换。是否可以在变压器的帮助下完成此操作,或者我可以在弹簧集成中使用其他技术。而且只能在DSL的帮助下完成吗?
控制器:
@Endpoint
public class CityEndpoint {
private static final String NAMESPACE_URI = "http://weather.com/senchenko";
private CityRepository cityRepository;
@Autowired
public CityEndpoint(CityRepository cityRepository) {
this.cityRepository = cityRepository;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCityRequest")
@ResponsePayload
public GetCityResponse getCityResponse(@RequestPayload GetCityRequest request){
GetCityResponse response = new GetCityResponse();
response.setCity(cityRepository.findCity(request.getName()));
return response;
}
}
配置:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/ws/*");
}
@Bean(name = "city")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema citySchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("CityPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://weather.com/senchenko");
wsdl11Definition.setSchema(citySchema);
return wsdl11Definition;
}
@Bean
public XsdSchema citySchema() {
return new SimpleXsdSchema(new ClassPathResource("xsd/weather.xsd"));
}
@Bean
@Transformer()
JsonToObjectTransformer jsonToObjectTransformer() {
return new JsonToObjectTransformer();
}
@Bean
@Transformer()
ObjectToMapTransformer objectToMapTransformer(){
return new ObjectToMapTransformer();
}
}
添加
我解决了重定向到SOAP的问题,但仍然不知道将JSON转换为SOAP信封并返回的最佳方法。
@Bean
public IntegrationFlow httpProxyFlow() {
return IntegrationFlows
.from(Http.inboundGateway("/service"))
.transform(t -> TEST_ENVOLOPE)
.enrichHeaders(h -> h.header("Content-Type", "text/xml; charset=utf-8"))
.handle(Http.outboundGateway("http://localhost:8080/ws")
.expectedResponseType(String.class))
.transform(t -> TEST_RESPONSE)
.get();
}
答案 0 :(得分:0)
您的问题不清楚,或者您不完全了解需要工作的技术。
SOAP 完全关于XML消息交换。在服务器端,您有一个特定的MessageDispatcherServlet
,它将输入的HTTP请求完全转换为XML的SOAP信封。 JSON完全没有。
您的CityEndpoint.getCityResponse()
由Spring WS Framework触发,当您的XSD定义和生成的模型通过JaxB将传入的SOAP请求从XML解组到域模型时,就会由Spring WS Framework触发。完全没有关于Spring Integration的事情。
在这种情况下,您的JsonToObjectTransformer
和ObjectToMapTransformer
毫无意义。它们不参与SOAP请求过程。
很抱歉让您失望,但您的问题甚至还不清楚,当JSON和XML完全不同且不兼容的协议时,JSON客户端将如何调用SOAP服务。