如何读取SOAP-Headers并将FaultHeaders添加到AXIS 2 Web Service发送的响应中

时间:2012-01-26 08:26:50

标签: soap header axis2

我有一个WSDL,它定义了客户端需要发送的自定义SOAP标头和服务器可以作为响应发送的SOAP-Fault标头。

现在我遇到了问题。我无法理解如何在使用AXIS 2(版本1.6.1)生成的响应上设置SOAP-Fault-headers或读取请求附带的SOAP-Header。

有人能指出我正确的方向吗?

非常感谢你。

2 个答案:

答案 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;
}