我有一个简单的Java接口/实现,我通过CXF公开。我的Spring配置文件中有一个jaxws元素,如下所示:
<jaxws:endpoint id="managementServiceJaxws"
implementor="#managementService" address="/jaxws/ManagementService" >
</jaxws:endpoint>
它从我的带注释的接口生成WSDL并公开该服务。然后,当我点击http://myhostname/cxf/jaxws/ManagementService?wsdl时,我得到了一个可爱的WSDL。在wsdl:service元素的底部,我会看到
<soap:address location="http://myhostname/cxf/jaxws/ManagementService"/>
但是,大约一天左右的时间,没有应用程序重启,点击相同的网址会产生:
<soap:address location="http://localhost/cxf/jaxws/ManagementService"/>
这会导致许多问题,但我真正想要的是修复它。现在,web服务的特定客户端将端点设置为localhost;因为它在同一台机器上运行。是否有可能重新生成和缓存wsdl然后暴露'localhost'版本?在第一部分中,我不知道从CXF中的?wsdl请求到响应的确切机制。几乎可以肯定,它正在检索一些缓存版本,因为它应该通过询问servletcontainer(Jetty)来确定地址。
作为参考我知道一个权宜之计解决方案是在客户端上使用主机名并确保一个别名,以便它通过环回。
编辑: 作为参考,我确认如果我启动我的应用程序并首先通过localhost命中它,那么通过主机名查询wsdl会将地址显示为localhost。相反,首先通过主机名命中它会导致localhost请求显示主机名。显然有些东西被缓存在这里。
EDIT2: 我认为问题可能是OsgiServletController,因为有一个方法:
private synchronized void updateDests(HttpServletRequest request) {
if (disableAddressUpdates) {
return;
} //snip
但我认为没有办法确认问题是这个布尔值设置为true或者我实际上如何更新它!
答案 0 :(得分:0)
请您确认您使用的CXF版本 - 我没有看到我的版本的缓存行为 - 2.3.1。
服务的URL是根据客户端用于请求的URL(基本上使用httpRequest.getRequestURL)确定的,除非为上面的端点标记提供了显式的publishedEndpointUrl属性。
编辑:奇怪,听起来你的编辑2可能是正确的方向,就像设置“禁用地址更新”一样,尝试在web.xml文件中以这种方式初始化CXFServlet,看看它是否有帮助: / p>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>disable-address-updates</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
答案 1 :(得分:0)
六必居,
你的回答似乎是正确的。但是,订单似乎错了。
load-on-startup
标记应该在最后一行,否则它会在Eclipse中显示错误。
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<init-param>
<param-name>disable-address-updates</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>