java - 使用 CXF 在 Web 服务请求上添加 header

标签 java web-services cxf

如何在 Web 服务客户端请求上添加如下 XML 所示的 header ?
下面的 xml 是由 SOAP UI 自动生成的请求,只要提供正确的用户名/密码,它就可以正常工作。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dof="http://dof.ad.com">
   <soapenv:Header>
      <dof:UserCredentials>
         <!--Optional:-->
         <dof:userName></dof:userName>
         <!--Optional:-->
         <dof:password></dof:password>
      </dof:UserCredentials>
   </soapenv:Header>
   <soapenv:Body>
      <dof:CheckService/>
   </soapenv:Body>
</soapenv:Envelope>

我想知道如何使用 apache CXF 添加 header 部分。我已经使用 WSDL 中的 CXF 自动生成了代码(见下文)并检查了各种文章,但代码仍然无法正常工作。我假设发送的请求不正确或者没有 header 。

public static void checkServiceMan() {
    String address = "https://WSDL_URL";

    JaxWsProxyFactoryBean jaxWsProxy = new JaxWsProxyFactoryBean();
    jaxWsProxy.setServiceClass(DOFairservice.class);
    jaxWsProxy.setAddress(address);

    DOFairservice serviceClient = (DOFairservice) jaxWsProxy.create();

    ObjectFactory factory = new ObjectFactory();
    UserCredentials uc = factory.createUserCredentials();
    uc.setUserName("username");
    uc.setPassword("password");

    List<Header> headerList = new ArrayList<Header>();
    try {

        Header testCredentialsHeader = new Header(new QName("http://DOF", "DOFairservice")
                ,uc
                ,new JAXBDataBinding(UserCredentials.class));

        headerList.add(testCredentialsHeader);

    } catch (JAXBException e) {

        e.printStackTrace();
    }
    ((BindingProvider) serviceClient).getResponseContext().put(Header.HEADER_LIST, headerList);

    Client client = ClientProxy.getClient(serviceClient);
    HTTPConduit conduit = (HTTPConduit) client.getConduit();
    HTTPClientPolicy policy = conduit.getClient();
    policy.setReceiveTimeout(10000);

    String resp = serviceClient.checkService(); **<--- ERROR HERE**
    System.out.println("Response from Customs Web Service: "+ resp);

    System.out.println("Web Service Header Test Done");
}

错误信息

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Error reading XMLStreamReader: Unexpected character '8' (code 56) in prolog; expected '<'
 at [row,col {unknown-source}]: [1,1]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
    at com.sun.proxy.$Proxy45.checkService(Unknown Source)
    at ae.abudhabi.dof.client.CheckServiceClient.checkServiceMan(CheckServiceClient.java:103)
    at ae.abudhabi.dof.client.CheckServiceClient.main(CheckServiceClient.java:112)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '8' (code 56) in prolog; expected '<'

最佳答案

我找到了一个简单的解决方案,可以在发送到 Web 服务的请求上添加 header 。 我所需要做的只是在我的 Maven CXF 插件构建中添加下面的额外代码。

<extendedSoapHeaders>true</extendedSoapHeaders>

只有在 wsdl 中显式声明了肥皂头部分(在我的例子中)时,上面的额外行才有效。

<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:CheckUserCredentials" part="UserCredentials" use="literal"/>
</wsdl:input>

我重新生成了源代码并进行了修改,请参见下文

public static void checkServiceMan() {
    String address = "https://WSDL_URL";

    JaxWsProxyFactoryBean jaxWsProxy = new JaxWsProxyFactoryBean();
    jaxWsProxy.setServiceClass(DOFairservice.class);
    jaxWsProxy.setAddress(address);

    DOFairservice serviceClient = (DOFairservice) jaxWsProxy.create();

    ObjectFactory factory = new ObjectFactory();
    UserCredentials uc = factory.createUserCredentials();
    uc.setUserName("username");
    uc.setPassword("password");

    String resp = serviceClient.checkService(uc); **<--- New Argument Here**
    System.out.println("Response from Customs Web Service: "+ resp);

    System.out.println("Web Service Header Test Done");
}

一切工作正常, header 现已插入到发送到 Web 服务的 XML 请求中。

关于java - 使用 CXF 在 Web 服务请求上添加 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45908688/

相关文章:

javascript - 函数等待查询结果

java - 如何使用 Apache Camel 正确聚合文件内容?

java - 从 Java 应用程序打开 WMV 文件时访问被拒绝

java - NoClassDefFoundError : Could not initialize class org. apache.axis2.description.AxisService

java - JSON 在响应中返回空值

grails - 现有项目中的新 SOAP 请求绑定(bind)失败

java - 如何解决添加 "?useUnicode"的两个错误?

java - 将 c# DateTime 序列化为 SAP Webservice 的 Java 时间和 Java 日期

java - 尽管将 'disableCNCheck' 设置为 true,但 https URL 主机名与通用名称 (CN) 不匹配

java - Apache CXF : adding custom documentation in the WSDL?