关于axis2调用webservices出现错误:org.apache.axis2.AxisFault: 服务器无法处理请求。 ---> 未将对象引用设置到对象

javaFay 发布于 2013/01/08 10:10
阅读 37K+
收藏 0
我这边是java项目,调用外部系统(C#)的webservices接口,但是出现以下错误:
Exception in thread "main" org.apache.axis2.AxisFault: 服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。
at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531)
at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:555)
at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:531)
at com.gzedu.lms.studyHourReport.CheckSingleSignOn.sendToServiceByWebService(CheckSingleSignOn.java:84)
at com.gzedu.lms.studyHourReport.CheckSingleSignOn.main(CheckSingleSignOn.java:135)

但是调用网上开放的webservice接口没有问题! 具体代码如下:

import java.util.HashMap;
import java.util.Map;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.transport.http.HTTPConstants;

import com.gzdec.common.config.AppConfig;
import com.gzdec.common.config.AppConfigException;

public class CheckSingleSignOn {

// 接口命名空间名
private  String omNameSpace;
// 接口方法名
private  String methodName;
// 接口WebService地址
private  EndpointReference targetEPR ;
// 接口SOAPAction
private  String action ;

public CheckSingleSignOn(){
try {
targetEPR=new EndpointReference(AppConfig.getProperty("provinceSysUrl"));
omNameSpace=AppConfig.getProperty("provinceSysNameSpace");
action="http://tempuri.org/ImportData";
methodName="ImportData";
} catch (AppConfigException e) {
e.printStackTrace();
}
}

/**
 * 使用token返回的paramter访问webservice
 * @param formMap
 *  @return
 * @throws Exception
 */
public String sendToServiceByWebService(Map formMap) throws Exception {
/*String parseMessage=getAPIAttribute(formMap);
if(!parseMessage.equals(""))
return parseMessage;*/
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(omNameSpace, "");

// 请求参数设置
Options options = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);// 设定传输协议
options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);// 设定SOAP版本soap1.2
options.setTimeOutInMilliSeconds(600000L);//1分钟超时
options.setAction(action);
options.setProperty(HTTPConstants.CHUNKED, "false");//设置不受限制.

// 客户端绑定参数设置
ServiceClient sender = null;
sender = new ServiceClient();
sender.setOptions(buildOptions());

// 设定访问的接口方法
OMElement method = fac.createOMElement(methodName, omNs);// 要调用的接口方法名称
OMElement sysId = fac.createOMElement("SystemID", omNs);// 方法的第一个参数名称
OMElement password = fac.createOMElement("SystemPwd", omNs);// 方法的第二个参数名称
OMElement data = fac.createOMElement("Data", omNs);// 方法的第三个参数名称
sysId.addChild(fac.createOMText(sysId, "71D05F8D-E74A-4E53-9265-9BF0D14C7C64"));// 设定参数的值
method.addChild(sysId);
password.addChild(fac.createOMText(password, "597sTmD53"));// 设定参数的值
method.addChild(password);
PottingXmlData p = new PottingXmlData();
data.addChild(fac.createOMText(data, AESWithJCE.Encrypto(p.pottingCheckUserData(formMap))));// 设定参数的值
method.addChild(data);

// 设定其他方法参数,针对参数是数组的情况如何处理?可以考虑为参数添加child,
OMElement result = sender.sendReceive(method);// 调用接口方法
String msg = result.toString();
sender.cleanupTransport();//关闭资源
sender.cleanup();
sender = null;
return isUserLogin(msg,formMap);
}

public String isUserLogin(String msg, Map formMap) {
if(msg.equals("")){
return "未返回参数!";
}else{
return msg;
}

}

 /**
  * @see 设置连接属性
  *  @return
  */
 public Options  buildOptions(){
  Options options = new Options();
        options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
        options.setAction(action);
        options.setTo(targetEPR);
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
        options.setProperty(HTTPConstants.CHUNKED, "false");//设置不受限制.
        options.setProperty(Constants.Configuration.HTTP_METHOD,HTTPConstants.HTTP_METHOD_POST);
        options.setAction(action);
        return options;

 }
 





/**
 * 测试
 * @param args
 * @throws Exception
 */
public static void main(String[] args) throws Exception {
CheckSingleSignOn util = new CheckSingleSignOn();
Map map = new HashMap();
map.put("USER_ID", "123456789");
map.put("REALNAME", "测试");
map.put("PAPERS_NUMBER", "441301119890001546");
String result = util.sendToServiceByWebService(map);
System.out.println("toString====" + result);

}
}

SystemID,SystemPwd,Data 这3个参数是这个接口所需的
AESWithJCE.Encrypto(p.pottingCheckUserData(formMap))) 返回的是一个加密后的字符串(因接口方法需要加密传输数据)

传上所调用接口的wsdl内容截图,大家帮忙看看我是不是哪里设置错了,问题折腾我几天了,百度谷歌都试过了,无尽感激!

加载中
0
j
javaFay
已经解决了! 是对方的服务器代码问题!
zhangx929
zhangx929
回复 @渺小 : 你好,我也遇到这个问题了,请问你的解决了吗?什么原因导致的呢?
l
liulifei
就是对方服务器报了个异常,也就是对方程序有问题,或你给对方的数据有问题导致对方报了个异常
渺小
你好,时间可能有点久 我也遇到这个问题,你还记得是什么原因吗?
返回顶部
顶部