我有一个WSDL,它定义了客户端需要发送的自定义SOAP标头和服务器可以作为响应发送的SOAP-Fault标头。
现在我遇到了问题。我无法理解如何在使用AXIS 2(版本1.6.1)生成的响应上设置SOAP-Fault-headers或读取请求附带的SOAP-Header。
有人能指出我正确的方向吗?
非常感谢你。
答案 0 :(得分:0)
如果与安全有关,你应该看看Rampart。
如果没有,请尝试查看
客户方: 从存根中,通过_getServiceClient()检索ServiceClient。 enter link description here
服务器端: 如果我没记错是通过MessageContext完成的,那么从axiscontext opbtain当前消息上下文。
答案 1 :(得分:0)
向soap响应添加自定义错误。这可以通过两种方式之一完成。
1)简单地抛出带有消息的Java异常将生成一个简单的Axis2错误
示例:
throw new java.lang.UnsupportedOperationException("Please implement " +
this.getClass().getName() + "#SomeOperationName");
另请注意:如果您使用Axis2 WSDL2JAVA实用程序生成服务,则上面的行将添加到每个已定义的WSDL操作的MyServiceName_Skeleton源。
部署.aar后,可以使用网络浏览器验证与每项操作的连接,例如https://server:port/axis2/services/MyServiceName?SomeOperationName
。
2)确保WSDL定义了一个可选的(出现:0)自定义Fault结构。这可以使用任何其他必需(和空)元素发送给客户端。
示例:
com.some.service.operation.SomeOperationNameResponse_Type OPRT = new com.some.service.operation.SomeOperationNameResponse_Type();
com.some.service.SomeOperationNameResponse OPR = new com.some.service.SomeOperationNameResponse();
.
.
.
if ((rcStatusString.equals("Succeeded")) || (rcStatusString.equals("Warning"))) {
<build happy path response>
} else if (rcStatusString.equals("Failed")) {
final MYFault fault = new MYFault();
final MYFault_Type faultType = new MYFault_Type();
final MYFaultList faultList = new MYFaultList();
final MYFaultList_Type faultListType = new MYFaultList_Type();
faultType.setFaultCode("10100");
faultType.setFaultSubcode("9999");
faultType.setFaultType(FaultType_Enum.SYSTEM);
faultType.setFaultReasonText("Some Operation Failed");
faultType.setSeverity(FaultSeverity_Enum.CRITICAL_ERROR);
//fault.setMYFault(faultType);
faultListType.addMYFault(faultType);
OTHRTYPE.setAValue("");
OPRT.setAValueType(OTHRTYPE);
OPRT.setMYFaultList(faultListType);
} else {
throw new java.lang.UnsupportedOperationException(
"MYSERVICE: [Some Operation] Session: "+sessVal+" Request ID: "+rcRequestId+" Unrecognized Completion Status ["+rcStatusString+"]");
}
OPR.setSomeOperationResponse(OPRT);
return OPR;
}