gpt4 book ai didi

java - 如何通过Spring Integration连接SOAP服务器和JSON客户端?

转载 作者:太空宇宙 更新时间:2023-11-04 09:45:27 24 4
gpt4 key购买 nike

美好的一天。我是 Spring 集成的新手。我编写了一个简单的 SOAP 服务器,我需要连接一个通过 JSON 进行通信的客户端和一个通过 SOAP 进行通信的服务器,但我对该框架提供的技术感到困惑。据我了解,有 JsonToObjectTransformer 和 ObjectToMapTransformer 转换器。据我了解,有必要在将数据传输到 Controller 之前对其进行转换。是否可以在变压器的帮助下做到这一点,或者我可以在 Spring 集成中使用其他技术。这只能通过 DSL 来完成吗?

Controller :

@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();
}

最佳答案

您的问题不清楚,或者您不完全熟悉工作所需的技术。SOAP 完全与 XML 消息交换有关。在服务器端,您有一个特定的 MessageDispatcherServlet,它将传入的 HTTP 请求完全转换为 XML 形式的 SOAP 信封。根本就没有关于 JSON 的任何内容。

当传入的 SOAP 请求根据您的 XSD 定义和生成的模型通过 JaxB 从 XML 解码到域模型时,Spring WS 框架会触发您的 CityEndpoint.getCityResponse() 。根本就没有关于 Spring Integration 的任何内容。

您的 JsonToObjectTransformerObjectToMapTransformer 在这种情况下没有任何意义。它们不参与 SOAP 请求过程。

很抱歉让您失望,但您的问题甚至不清楚,当 JSON 和 XML 完全不同且不兼容的协议(protocol)时,JSON 客户端将如何调用 SOAP 服务。

关于java - 如何通过Spring Integration连接SOAP服务器和JSON客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55473366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com