我正在开发一个带有审计的 Web 服务代理(稍后使用缓存 = 创建自己的响应),我需要生成 @Endpoints(这样只会转发,即调用远程 Web 服务或至少虚拟)。对于代理来说,编组/解组似乎是必要的,它将为请求添加“一些东西”......
我们将使用 spring-ws 和 JAXB。获取代理 Web 服务的所有 XSD 和静态 WSDL。
周围有什么提示吗?有人在做类似的事情吗?你怎么样?
有没有一种简单的方法可以使用弹簧或弹簧集成来实现这一点?
提前致谢..
我正在开发一个带有审计的 Web 服务代理(稍后使用缓存 = 创建自己的响应),我需要生成 @Endpoints(这样只会转发,即调用远程 Web 服务或至少虚拟)。对于代理来说,编组/解组似乎是必要的,它将为请求添加“一些东西”......
我们将使用 spring-ws 和 JAXB。获取代理 Web 服务的所有 XSD 和静态 WSDL。
周围有什么提示吗?有人在做类似的事情吗?你怎么样?
有没有一种简单的方法可以使用弹簧或弹簧集成来实现这一点?
提前致谢..
这应该可以同时使用 Spring WS 和 Spring Integration:
使用 Spring WS,您可以为远程 WS 创建一个代理类,包装一个org.springframework.ws.client.core.WebServiceTemplate来与 WS 对话——它有 API 负责将请求编组到 xml 并解组回复。
使用 Spring Integration,您可以使用出站 Web 服务网关,但您需要在其前面使用消息网关,该网关将充当您的代理,如下所示:
<int:gateway id="wsproxy" service-interface="..ProxyInterface" default-request-channel="requestChannel" default-reply-channel="replyChannel"/>
<int-ws:outbound-gateway id="wsGateway" request-channel="requestChannel" uri="http://serviceURL" marshaller="someMarshaller" unmarshaller="someUnmarshaller"/>
但是,我会推荐使用 WebserviceTemplate 的第一种方法,因为您在这里没有非常复杂的集成需求。
今天我可以告诉我们在没有弹簧集成的情况下我们是如何进行的。我们发现了两种不同的方式来生成@Endpoint 类。
1)使用XSLT和Freemarker ,我们在预编译阶段生成了端点类源。XSLT 转换遍历所有 WSDL 文件以创建一个摘要文件,然后将其用于生成源代码。
2)我们使用Javassist复制模板类,然后生成有关JAXB2Marshaller实例内容的方法,最后使用FactoryBean实例化对象,所有这些都在服务器启动时进行。
我们在这里遇到的问题是一组以格式编写的 XSD 文件,导致根对象在没有 @XmlRootAnnotation 的情况下生成。我们内部的 Javassist 版本与 Java 1.4(无泛型)一起使用,因此我们对 XJC 使用全局自定义文件并在根对象上强制使用 @XmlRootAnnotation。
这两种解决方案各有利弊,但都比使用 ESB 更简单。