cxf自动生成的wsdl被nginx代理后soap:address location

由于开发webservice使用的是cxf的java first、wsdl是自动生成的。其中生成的

<wsdl:port binding="tns:MyServiceSoapBinding" name="MyServicePort">
<soap12:address location="http://www.domain.com/appcontext/Service/MyService"/>
</wsdl:port>

location 是根据请求的request来自动生成的
如果用127.0.0.1来访问生成的wsdl就是

<wsdl:port binding="tns:MyServiceSoapBinding" name="MyServicePort">
<soap12:address location="http://127.0.0.1/appcontext/Service/MyService"/></wsdl:port>

如果用localhost来访问生成的wsdl就是

<wsdl:port binding="tns:MyServiceSoapBinding" name="MyServicePort">
<soap12:address location="http://localhost/appcontext/Service/MyService"/>
</wsdl:port>

这就会产生一个问题如果用nginx或者apache放在tomcat的前端的话,tomcat获取的request是内网的地址

比如访问nginx的
www.domain.com—>用nginxproxy到 nginxserver所在的内网地址是localhost:8080
那么动态生成的wsdl
就变成了

<wsdl:port binding="tns:MyServiceSoapBinding" name="MyServicePort">
<soap12:address location="http://localhost:8080/appcontext/Service/MyService"/>
</wsdl:port>

这将导致wsdl的不准确。

解决办法是用publishedEndpointUrl参数来明确这个location的地址
如下

<jaxws:endpoint implementor="#MyServiceEndpoint" address="/MyService" publishedEndpointUrl="http://www.domain.com/appcontext/Service/MyService">
<jaxws:binding>
<soap:soapBinding version="1.2" />
</jaxws:binding>
<jaxws:dataBinding>
<bean class="org.apache.cxf.jaxb.JAXBDataBinding"/>
</jaxws:dataBinding>
</jaxws:endpoint>

原创文章,转载请注明: 转载自海波无痕

本文链接地址: cxf自动生成的wsdl被nginx代理后soap:address location

文章的脚注信息由WordPress的wp-posturl插件自动生成

此条目发表在javaee, spring分类目录,贴了, , , , , , , 标签。将固定链接加入收藏夹。

cxf自动生成的wsdl被nginx代理后soap:address location》有 7 条评论

  1. 鬼谷先生说:

    请问您是怎么配置的呢,现在也在研究,但是不知道nginx怎么配置wsdl,可否告知下?谢谢

    [回复]

    ziki 回复:

    在publishedEndpointUrl指定你对外的地址即可啊。

    [回复]

  2. Honwhy说:

    配置Nginx的proxy_set_header Host 请求头就能解决这个问题

    [回复]

    曹志华 回复:

    我试了,不好使

    [回复]

  3. 刘东赫说:

    服务端不解决,客户端能解决吗

    [回复]

    admin 回复:

    显然不行,除非你口头额外告知。

    [回复]

    admin 回复:

    客户端拿到wsdl后,手工把那个地址改了就好了,就是一个地址,如果不经常变动的话,无关双方业务契约。

    [回复]

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论链接可以 移除 nofollow.