javaFay 发布于 2013/01/08 10:10
阅读 47K+
收藏 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内容截图,大家帮忙看看我是不是哪里设置错了,问题折腾我几天了,百度谷歌都试过了,无尽感激!