使用wsdl2java生成的存根时,向CXF添加SOAP头

使用wsdl2java生成的存根时,向CXF添加SOAP头,java,header,cxf,Java,Header,Cxf,我正在尝试编写一个webservice客户端。我使用CXF 3.2 wsdl2java从wsdl生成java存根。我在这里和其他谷歌搜索中尝试了几种方法,在我发出的soap请求中添加一个标题,但到目前为止还无法让它工作。我觉得我缺少了一些简单的东西,比如使用CXF添加头应该不会那么复杂,但我想我不知道 以下是客户端的完整java代码: public class sforceClient { private static QName SERVICE_NAME = new QName("urn

我正在尝试编写一个webservice客户端。我使用CXF 3.2 wsdl2java从wsdl生成java存根。我在这里和其他谷歌搜索中尝试了几种方法,在我发出的soap请求中添加一个标题,但到目前为止还无法让它工作。我觉得我缺少了一些简单的东西,比如使用CXF添加头应该不会那么复杂,但我想我不知道

以下是客户端的完整java代码:

public class sforceClient {

  private static QName SERVICE_NAME = new QName("urn:partner.soap.sforce.com", "SforceService");
  private static String serverURL;
  private static String sessionId = "";
  private static String theQuery;
  private static File wsdlFile;
  private static URL wsdlURL;

  public sforceClient() {
//Setup code to log output to terminal
      System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
      System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
      System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
      System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
  }

  public static Object callQuery()
  {
//Validate wsdl file
    try {
      wsdlFile = new File(theWsdl);
      if (wsdlFile.exists()) {
        wsdlURL = wsdlFile.toURI().toURL();
      } else {
        wsdlURL = new URL(theWsdl);
      }
    } catch (MalformedURLException mue) {
      mue.printStackTrace();
    }

//Instantiate stubs from wsdl2java
    SforceService ss = new SforceService(wsdlURL, SERVICE_NAME);
    Soap port = ss.getSoap();
    LoginResult resp;

    try {
      if ("".equals(sessionId)) { //SessionId is not set, login to the server and set the values
        resp = port.login(userName,password+securityToken);
        serverURL = resp.getServerUrl();
        sessionId = resp.getSessionId();
      }
      BindingProvider bp = (BindingProvider)port;
//Add SessionHeader tag 
      List<Header> headers = new ArrayList<Header>();
      SOAPFactory sf = SOAPFactory.newInstance();
      SOAPElement authElement = sf.createElement(new QName("urn:partner.soap.sforce.com", "SessionHeader"));
//Add sessionId to SessionHeader
      SOAPElement tokenElement = authElement.addChildElement("sessionId");
      tokenElement.addTextNode(sessionId);
      SoapHeader tokenHeader = new SoapHeader(new QName("urn:partner.soap.sforce.com", "SessionHeader"), authElement);
//Add header to headers list
      headers.add(tokenHeader);
      bp.getRequestContext().put(Header.HEADER_LIST, headers);
//Change the endpoint url to correct API url. Provided from response to login request
      bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serverURL);
//Get the result from the query request
      QueryResult qResult= port.query(theQuery);
      return qResult;
    } catch (LoginFault lf) {
      lf.printStackTrace();
    } catch (InvalidIdFault iif) {
      iif.printStackTrace();      
    } catch (UnexpectedErrorFault uef) {
      uef.printStackTrace();      
    } catch (MalformedQueryFault mqf) {
      mqf.printStackTrace();      
    } catch (InvalidQueryLocatorFault iqlf) {
      iqlf.printStackTrace();      
    } catch (InvalidFieldFault iff) {
      iff.printStackTrace();      
    } catch (InvalidSObjectFault isof) {
      isof.printStackTrace();     
    } catch (SOAPException jbe) {
      jbe.printStackTrace();
    }
    return null;
  }

    public static void setUserName(String userName) {
        sforceClient.userName = userName;
    }

    public static String getUserName() {
        return userName;
    }

    public static void setPassword(String password) {
        sforceClient.password = password;
    }

    public static String getPassword() {
        return password;
    }

    public static void setSecurityToken(String securityToken) {
        sforceClient.securityToken = securityToken;
    }

    public static String getSecurityToken() {
        return securityToken;
    }

    public static void setTheWsdl(String theWsdl) {
        sforceClient.theWsdl = theWsdl;
    }

    public static String getTheWsdl() {
        return theWsdl;
    }

    public static void setTheQuery(String theQuery) {
        sforceClient.theQuery = theQuery;
    }

    public static String getTheQuery() {
        return theQuery;
    }

    public static void setServerURL(String serverURL) {
        sforceClient.serverURL = serverURL;
    }

    public static String getServerURL() {
        return serverURL;
    }

    public static void setSessionId(String sessionId) {
        sforceClient.sessionId = sessionId;
    }

    public static String getSessionId() {
        return sessionId;
    }
}
公共类sforceClient{
私有静态QName服务_NAME=新QName(“urn:partner.soap.sforce.com”,“sforce服务”);
私有静态字符串serverURL;
私有静态字符串sessionId=“”;
私有静态字符串查询;
私有静态文件wsdlFile;
私有静态URL-wsdlURL;
公共sforceClient(){
//记录输出到终端的设置代码
System.setProperty(“com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump”,“true”);
System.setProperty(“com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump”,“true”);
System.setProperty(“com.sun.xml.ws.transport.http.HttpAdapter.dump”,“true”);
System.setProperty(“com.sun.xml.internal.ws.transport.http.HttpAdapter.dump”,“true”);
}
公共静态对象callQuery()
{
//验证wsdl文件
试一试{
wsdlFile=新文件(wsdl);
if(wsdlFile.exists()){
wsdlURL=wsdlFile.toURI().tour();
}否则{
wsdlURL=新URL(wsdl);
}
}捕获(格式不正确){
mue.printStackTrace();
}
//从wsdl2java实例化存根
SforceService ss=新的SforceService(wsdlURL,服务名称);
Soap端口=ss.getSoap();
后勤结果;
试一试{
如果未设置(“.equals(sessionId)){//sessionId,请登录到服务器并设置值
resp=端口登录(用户名、密码+securityToken);
serverURL=resp.getServerUrl();
sessionId=resp.getSessionId();
}
BindingProvider bp=(BindingProvider)端口;
//添加SessionHeader标记
列表标题=新建ArrayList();
SOAPFactory sf=SOAPFactory.newInstance();
SOAPElement authElement=sf.createElement(新的QName(“urn:partner.soap.sforce.com”,“SessionHeader”);
//将sessionId添加到SessionHeader
SOAPElement-tokenElement=authElement.addChildElement(“sessionId”);
tokenElement.addTextNode(sessionId);
SoapHeader tokenHeader=新的SoapHeader(新的QName(“urn:partner.soap.sforce.com”、“SessionHeader”)、authElement);
//将标题添加到标题列表
headers.add(tokenHeader);
bp.getRequestContext().put(Header.Header_列表,headers);
//将端点url更改为正确的API url。从对登录请求的响应中提供
bp.getRequestContext().put(BindingProvider.ENDPOINT\u ADDRESS\u属性,serverURL);
//从查询请求中获取结果
QueryResult qResult=port.query(查询);
返回qResult;
}捕获(逻辑故障左前){
lf.printStackTrace();
}捕获(失效故障iif){
iif.printStackTrace();
}捕获(意外错误uef){
uef.printStackTrace();
}捕获(格式错误的QueryFault mqf){
mqf.printStackTrace();
}捕捉(无效QueryLocator故障iqlf){
iqlf.printStackTrace();
}捕获(无效场故障iff){
iff.printStackTrace();
}捕获(InvalidObjectFault isof){
isof.printStackTrace();
}catch(SOAPException jbe){
jbe.printStackTrace();
}
返回null;
}
公共静态void setUserName(字符串用户名){
sforceClient.userName=用户名;
}
公共静态字符串getUserName(){
返回用户名;
}
公共静态无效设置密码(字符串密码){
sforceClient.password=密码;
}
公共静态字符串getPassword(){
返回密码;
}
公共静态void setSecurityToken(字符串securityToken){
sforceClient.securityToken=securityToken;
}
公共静态字符串getSecurityToken(){
返回securityToken;
}
公共静态void setTheWsdl(字符串theWsdl){
sforceClient.theWsdl=theWsdl;
}
公共静态字符串getTheWsdl(){
返回WSDL;
}
公共静态void设置查询(字符串查询){
sforceClient.theQuery=查询;
}
公共静态字符串getTheQuery(){
返回查询;
}
公共静态无效设置服务器URL(字符串服务器URL){
sforceClient.serverURL=serverURL;
}
公共静态字符串getServerURL(){
返回serverURL;
}
公共静态void setSessionId(字符串sessionId){
sforceClient.sessionId=sessionId;
}
公共静态字符串getSessionId(){
返回会话ID;
}
}
我正在寻找它来生成此soap请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:partner.soap.sforce.com">
   <soapenv:Header>
      <urn:SessionHeader>
         <urn:sessionId>MYSESSIONID</urn:sessionId>
      </urn:SessionHeader>
   </soapenv:Header>
   <soapenv:Body>
      <urn:query>
         <urn:queryString>SELECT AMOUNT, ID, LEADSOURCE, NAME, OWNERID, PRICEBOOK2ID, STAGENAME, TYPE, ACCOUNTID  FROM OPPORTUNITY</urn:queryString>
      </urn:query>
   </soapenv:Body>
</soapenv:Envelope>

MYSESSIONID
从OPPORTUNITY中选择金额、ID、LEADSOURCE、名称、所有者ID、PRICEBOOK2ID、STAGENAME、类型、ACCOUNTID
这就是我得到的:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:query xmlns:ns3="urn:sobject.partner.soap.sforce.com" xmlns:ns2="urn:partner.soap.sforce.com" xmlns="urn:fault.partner.soap.sforce.com">
<ns2:queryString>SELECT AMOUNT, ID, LEADSOURCE, NAME, OWNERID, PRICEBOOK2ID, STAGENAME, TYPE, ACCOUNTID  FROM OPPORTUNITY</ns2:queryString>
</ns2:query>
</S:Body>
</S:Envelope>

从OPPORTUNITY中选择金额、ID、LEADSOURCE、名称、所有者ID、PRICEBOOK2ID、STAGENAME、类型、ACCOUNTID