Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法打印来自SOAP Web服务的XML响应_Java_Wsdl_Code Generation_Axis2 - Fatal编程技术网

Java 无法打印来自SOAP Web服务的XML响应

Java 无法打印来自SOAP Web服务的XML响应,java,wsdl,code-generation,axis2,Java,Wsdl,Code Generation,Axis2,我无法打印来自Soap Web服务的响应 通过编辑生成的存根代码看到了一些解决方案。但是我不能编辑生成的代码,因为它在每次构建时都会恢复为原始形式。寻找一个解决方案,我可以得到解决方案打印而不改变生成的代码 我正在使用Spring Boot微服务中的SOAP服务 ServiceContext serviceConxt=OMSchedulingService.\u getServiceClient().getServiceContext(); OperationContext OperationC

我无法打印来自Soap Web服务的响应

通过编辑生成的存根代码看到了一些解决方案。但是我不能编辑生成的代码,因为它在每次构建时都会恢复为原始形式。寻找一个解决方案,我可以得到解决方案打印而不改变生成的代码

我正在使用Spring Boot微服务中的SOAP服务

ServiceContext serviceConxt=OMSchedulingService.\u getServiceClient().getServiceContext();
OperationContext OperationContext=serviceConxt.getLastOperationContext();
MessageContext inMessageContext=operationContext.getMessageContext(“Out”);
log.info(inMessageContext.getEnvelope().toString());

您可以为soap消息添加消息处理程序

然后,一旦使用处理程序截获消息,就可以打印出响应

您将需要将处理程序添加到处理程序链中,这取决于您的项目,您可以通过编程或配置来完成

final class MyMessageHandler implements SOAPHandler<SOAPMessageContext>{


@Override
public void close(MessageContext context) {
    handle(context);
}

private boolean handle(MessageContext context) {
    if (context != null) {
        try {
            Object httpResponseCodeObj = context.get(SOAPMessageContext.HTTP_RESPONSE_CODE);

            if (httpResponseCodeObj instanceof Integer)
                httpResponseCode = ((Integer) httpResponseCodeObj).intValue();

            if (context instanceof SOAPMessageContext) {
                SOAPMessage message = ((SOAPMessageContext) context).getMessage();
                ByteArrayOutputStream byteOut = new ByteArrayOutputStream(512);
                message.writeTo(byteOut);
                String messageStr = byteOut.toString(getCharacterEncoding(message));

                boolean outbound = Boolean.TRUE.equals(context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY));


                Logger.info(loggingPrefix, outbound ? "SOAP request: " : "SOAP response: ", replaceNewLines(messageStr));
            }

        } catch (SOAPException e) {
            Logger.error(e, loggingPrefix, "SOAPException: ", e.getMessage(), NEWLINE);
        } catch (IOException e) {
            Logger.error(e, loggingPrefix, "IOException: ", e.getMessage(), NEWLINE);
        }
    }

    return true;
}
最后一个类MyMessageHandler实现了SOAPHandler{
@凌驾
公共无效关闭(MessageContext上下文){
处理(上下文);
}
私有布尔句柄(MessageContext上下文){
if(上下文!=null){
试一试{
对象httpresponsecodebj=context.get(SOAPMessageContext.HTTP\u RESPONSE\u代码);
if(httpResponseCodeObj instanceof Integer)
httpResponseCode=((整数)httpResponseCodeObj).intValue();
if(SOAPMessageContext的上下文实例){
SOAPMessage消息=((SOAPMessageContext)上下文).getMessage();
ByteArrayOutputStream字节输出=新的ByteArrayOutputStream(512);
message.writeTo(字节输出);
字符串messageStr=byteOut.toString(getCharacterEncoding(message));
boolean outbound=boolean.TRUE.equals(context.get(MessageContext.MESSAGE_outbound_属性));
info(loggingPrefix,出站?“SOAP请求::“SOAP响应:”,replaceNewLines(messageStr));
}
}捕获(SOAPE例外){
错误(e,loggingPrefix,“SOAPException:”,e.getMessage(),换行符);
}捕获(IOE异常){
错误(e,loggingPrefix,“IOException:”,e.getMessage(),换行符);
}
}
返回true;
}

}

如果您不想实现拦截器,最简单的方法是通过vm参数使用日志记录:

JAVA_OPTS=-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.showdatetime=true -Dorg.apache.commons.logging.simplelog.log.httpclient.wire=debug -Dorg.apache.commons.logging.simplelog.log.org.apache.commons.httpclient=debug

这样,您应该可以在控制台中看到带有标题的请求/响应日志。

首先,您可以从客户端存根获取AxisConfiguration

AxisConfiguration axisConf = stub._getServiceClient().getAxisConfiguration();
处理传入和传出消息分为几个阶段。有一个阶段列表(一个流程),当一切正常(无错误)时进行处理,也有另一个阶段列表用于发生某些故障的情况,例如在消息处理过程中引发异常。每个流可能传入或传出,因此总共有4个流

List<Phase> phasesIn = axisConf.getInFlowPhases(); // normal incoming communication i.e. response from webservice
List<Phase> phasesOut = axisConf.getOutFlowPhases(); // normal outgoing communication
List<Phase> phasesFaultIn = axisConf.getInFaultFlowPhases(); // faulty incoming communication e.g. when an exception occurs during message processing
List<Phase> phasesFaultOut = axisConf.getOutFaultFlowPhases(); // faulty outgoing communication
Handler是一个扩展org.apache.axis2.handlers.AbstractHandler的类。 你只需要实施

public InvocationResponse invoke(MessageContext msgContext).
在这里,您可以访问MessageContext。当然,您可以像这样获得整个SOAP信封:

msgContext.getEnvelope().toString()
例如,将其打印到日志或另存为单独的文件。 记得把

return InvocationResponse.CONTINUE;
在处理程序成功处理消息的情况下的invoke方法末尾。否则,处理将在此处理程序中停止,整个进程将无法进入任何其他阶段。 如果需要使用WSS头查看整个消息,可以添加自己的阶段。例如,这会将自定义阶段添加为传出消息的最后一个处理阶段(Rampart的安全阶段之后也是如此)


当然,在生产环境中记录(并以任何其他方式公开)安全头是一个非常糟糕的主意。只在某些测试环境中进行调试。

这与工具有什么关系?我以前见过这个答案。但这对我不起作用。谢谢
return InvocationResponse.CONTINUE;
Phase phase = new Phase("SomePhase");
phase.addHandler(new SomeCustomHandler());
axisConf.getOutFlowPhases().add(phase);