以代码优先方法生成自定义WSDL

时间:2011-10-19 11:10:53

标签: web-services spring wsdl jax-ws cxf

我使用CXF和code-firts方法创建了一些Web服务。这是我的配置和代码:

的web.xml:

...
<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

的applicationContext.xml:

<jaxws:endpoint implementor="#testService" address="/test" />

TestService.java:

@Service
@WebService
public class TestService {

    @WebMethod
    public String random() {
        return "random=" + Math.random();
    }
}

这样,对http://localhost:8080/myWebApp/ws/test?wsdl的请求获得了一个漂亮的WSDL,其中包含:

<wsdl:service name="TestServiceService">
    <wsdl:port binding="tns:TestServiceServiceSoapBinding" name="TestServicePort">
        <soap:address location="http://localhost:8080/myWebApp/ws/test"/>
    </wsdl:port>
</wsdl:service>

问题是我需要一个不同的位置,具体取决于HttpServletRequest对象。所以,我需要以某种方式覆盖WSDL生成代码。我已经找到了这个内容创建的地方,没有成功。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

使用CXF 2.4.x,WSDL将通过org.apache.cxf.frontend.WSDLGetInterceptor发回。你可以在那里查看有关如何改变事物或类似事物的想法。

你到底想要改变什么?如果它只是soap:地址上的位置,你可以坚持一个在它之前运行的拦截器:

message.put(WSDLGetUtils.PUBLISHED_ENDPOINT_URL, "http://localhoost:8080/foo");

或类似。