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