如何创建Web服务代理?我们可以生成@Endpoints吗?

时间:2012-06-03 13:49:13

标签: java web-services spring proxy jaxb

我正在开发一个带有审计的Web服务代理(稍后使用缓存=创建自己的响应),我需要生成@Endpoints(这样只会转发,即调用远程Web服务或至少调用虚拟机)。编组/解编似乎是必要的,因为代理会在请求中添加“某些东西”......

我们要使用spring-ws和JAXB。获得代理Web服务的所有XSD和静态WSDL。

周围的任何提示?有人做类似的事吗?你是怎么做到的?

有一种简单的方法可以使用弹簧或弹簧集成来实现这一目标吗?

提前致谢..

2 个答案:

答案 0 :(得分:1)

这应该可以使用Spring WS和Spring Integration:

使用Spring WS,您可以为远程WS创建一个代理类,包围org.springframework.ws.client.core.WebServiceTemplate以与WS通信 - 它具有API来处理将请求编组到xml并解组响应。< / p>

使用Spring Integration,您可以使用outbound Webservices gateway,但是您需要使用消息传递网关,它将充当您的代理,沿着这些方向:

<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的方法,因为这里没有非常复杂的集成需求。

答案 1 :(得分:0)

今天我可以告诉我们如何在没有弹簧整合的情况下继续前进。我们发现了两种不同的生成@Endpoint类的方法。

1)使用 XSLT Freemarker ,我们在 预编译中生成了端点类源阶段。 XSLT转换遍历所有WSDL文件以创建一个摘要文件,然后用于生成源。

2)使用 Javassist 我们复制了模板类,然后生成了关于 JAXB2Marshaller 实例内容的方法,最后使用实例化了对象FactoryBean ,全部在服务器 启动

我们遇到的问题是在表单中编写的XSD文件集,导致生成的根对象没有@XmlRootAnnotation。 Javassist版本我们内部使用Java 1.4(没有泛型),因此我们使用XJC的全局自定义文件并强制在根对象上使用@XmlRootAnnotation。

这两种解决方案各有利弊,但两者都比使用ESB更简单。