我使用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生成代码。我已经找到了这个内容创建的地方,没有成功。
解决此问题的最佳方法是什么?
答案 0 :(得分:2)
使用CXF 2.4.x,WSDL将通过org.apache.cxf.frontend.WSDLGetInterceptor发回。你可以在那里查看有关如何改变事物或类似事物的想法。
你到底想要改变什么?如果它只是soap:地址上的位置,你可以坚持一个在它之前运行的拦截器:
message.put(WSDLGetUtils.PUBLISHED_ENDPOINT_URL, "http://localhoost:8080/foo");
或类似。