java - 无法修改 SOAP WebService 客户端中的 http 接受 header - JAX-WS 2.2.10 - JDK1.7

标签 java http-headers jax-ws webservice-client

我将 Web 服务客户端从 jdk1.6 jax-ws(v1?旧版本 - 2005)迁移到 jdk1.7 jax-ws 2.2.10。 旧的可以用,但新的有问题: 该服务(来自另一个社会,php服务器)回复我:http 406错误, Not Acceptable 。

我发送的接受 header 是:

Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8

在旧版本中,我有:

Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-type: text/xml;charset="utf-8"

所以我尝试像这样修改http header (在我的绑定(bind)处理程序链中的新处理程序内):

在我的客户端:

    javax.xml.ws.Binding binding = ((BindingProvider) ServiceXXX).getBinding();
    List<Handler> hchain = binding.getHandlerChain();
    if (hchain == null) {hchain = new ArrayList<Handler>();}
    hchain.add(new HTTPUserAgentHandler());
    binding.setHandlerChain(hchain);

在我的新处理程序中:

Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS);
if (null == headers) {headers = new HashMap<String, List<String>>();}
headers.put("Accept", Arrays.asList("text/xml", "multipart/related", "*/*"));
context.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

我的 http header 现在是正确的,但在 HttpTransportPipe 类中,它被覆盖了:

        reqHeaders.put("Content-Type", Collections.singletonList(ct.getContentType()));
        if (ct.getAcceptHeader() != null) {
            reqHeaders.put("Accept", Collections.singletonList(ct.getAcceptHeader()));
        }
        if (binding instanceof SOAPBinding) {
            writeSOAPAction(reqHeaders, ct.getSOAPActionHeader());
        }

服务器,显然是 1.1,需要我发送一个带有 "*/*" 的接受 知道如何做到这一点吗?

最佳答案

我想我找到了一种方法,但这不是完美的解决方案......(如果有人有更好的..) 所以 : 我在 ./src/META-INF/services 中添加了一个名为 com.sun.xml.ws.api.pipe.TransportTubeFactory 的文件,其中有:

com.YYY.XXX.MonHttpTransportTubeFactory

我添加了这个类:

package com.YYY.XXX;

import com.sun.xml.ws.api.pipe.ClientTubeAssemblerContext;
import com.sun.xml.ws.api.pipe.TransportTubeFactory;
import com.sun.xml.ws.api.pipe.Tube;
import com.sun.xml.ws.transport.http.client.HttpTransportPipe;

public class MonHttpTransportTubeFactory extends TransportTubeFactory{

    @Override
    public Tube doCreate(ClientTubeAssemblerContext context) {
        context.setCodec(new MonSOAPBindingCodec(context.getBinding().getFeatures()));
        return new HttpTransportPipe(context.getCodec(), context.getBinding());
    }
}

还有这个:(现有 SOAPBidingCodec jaxws-ri src 的副本):

public class MonSOAPBindingCodec extends MonMimeCodec implements com.sun.xml.ws.api.pipe.SOAPBindingCodec {
...
    public MonSOAPBindingCodec(WSFeatureList features, StreamSOAPCodec xmlSoapCodec) {
        super(getSoapVersion(features), features);

        this.xmlSoapCodec = xmlSoapCodec;
        xmlMimeType = xmlSoapCodec.getMimeType();

        String clientAcceptedContentTypes = xmlSoapCodec.getMimeType() + ", */*";

        WebServiceFeature fi = features.get(FastInfosetFeature.class);
...

因此,该服务调用我的 HttpTransportTubeFactory 并包含我的自定义 SOAP 编解码器。

虽然不是很漂亮,但是很管用..

关于java - 无法修改 SOAP WebService 客户端中的 http 接受 header - JAX-WS 2.2.10 - JDK1.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35359349/

相关文章:

java - 当框架中有两个 JPanel 时,在一个 JPanel 上绘画

java - 尝试实现一种递归算法,该算法确定一个字符串是否是其他两个字符串的有序混洗

java - Axon 服务器命令不包含路由 key

c# - 为 ASP.Net MVC 2 创建 RESTful 按钮

json - 如何在httpkit中将Content-Type设置为application/json

javascript - 获取ajax请求的请求头

web-services - 如何解决JAX_WS Web服务调用 "MustUnderstand headers are not understood"的失败?

java - 如何计算 JAX-WS 中的请求处理时间?

java - 为什么 Mule flow default-exception-strategy 没有效果?

java - itext 7 中的 writer.getverticalposition 替换是什么