HTTPServletRequest中的SOAP请求正文(XML)始终为空(JAVA)

HTTPServletRequest中的SOAP请求正文(XML)始终为空(JAVA),java,servlets,soap,request,ejb,Java,Servlets,Soap,Request,Ejb,我知道类似的问题已经在StackOverflow上发布了好几次,但所有的答案对我的情况都没有帮助 Target:在进一步处理SOAP请求XML之前,我需要将其记录到数据库中。 对于本次讨论,我很高兴能将其作为字符串并记录到控制台 问题:请求XML始终为空 环境:IBMWebSphereApplicationServerV8.5,EJB3.1Web服务(会话bean) 实际上,我使用javax.xml.soap.SOAPBody和SOAPMessage生成了一个有效的解决方案,但在生产过程中,似乎

我知道类似的问题已经在StackOverflow上发布了好几次,但所有的答案对我的情况都没有帮助

Target:在进一步处理SOAP请求XML之前,我需要将其记录到数据库中。
对于本次讨论,我很高兴能将其作为字符串并记录到控制台

问题:请求XML始终为空

环境:IBMWebSphereApplicationServerV8.5,EJB3.1Web服务(会话bean)

实际上,我使用javax.xml.soap.SOAPBody和SOAPMessage生成了一个有效的解决方案,但在生产过程中,似乎还有另一个组件导致了以下JAX-WS冲突:

ERROR org.apache.axis2.engine.AxisEngine receive-com.sun.xml.messaging.saaj.soap.ver1_1.Body1_1Impl与com.ibm.ws.webservices.engine.xmlsoap.SOAPBody不兼容
是的,StackOverflow和IBM在更改类加载器策略方面有多种变通方法,如“本地类加载器优先(父级最后)”,但我们目前不能这样做。
因此,我当前的方法(在另一个servlet上工作)是获取HTTPServletRequest,获取它的InputStream,并使用IOUtils.toString()将其转换为字符串

我知道一个请求只能使用一次,我找到了几种方法来避免它(比如使用HTTPServletRequestWrapper),但即使使用这些解决方法,请求XML也总是空的。
最终我想在一个适配器中进行日志记录,但出于测试原因,我也将我的尝试放入服务本身(它没有任何效果)

奇怪的是:我可以从请求中读取所有标题和属性(使用request.getHeader()request.getAttribute()!只有正文本身是空的

我正在使用SoapUI测试应用程序 请求XML:


响应实际上是不相关的,但工作正常

控制台输出:

编辑:注意内容类型和内容长度的标题[H]:
他们“知道”内容-如果我在请求XML中添加更多字符,则内容长度会相应更新。
所以我的结论是,内容没有丢失,但不知何故无法访问

Web服务:

LogHandler-只是为了展示我也尝试过的东西…:

public类EclsSimpleLogHandler实现javax.xml.ws.handler.soap.SOAPHandler
{
private Log Log=LogFactory.getLog(EclsSimpleLogHandler.class);
@凌驾
公共布尔handleMessage(MessageContext上下文){
布尔成功=假;
if(log.isDebugEnabled()){
debug(“handleMessage()…”);
}
Boolean outboundProperty=(Boolean)context.get(MessageContext.MESSAGE\u OUTBOUND\u PROPERTY);
//检查是否为入站(请求)或出站(响应)消息调用了处理程序
if(outboundProperty.booleanValue()){
成功=处理响应(上下文);
}否则{
//成功=HandlerRequest(上下文);
成功=真实;
}
回归成功;
}
私有布尔HandlerRequest(MessageContext MessageContext){
if(log.isDebugEnabled()){
log.debug(“处理请求(入站)”;
}
//最初计划在这里进行日志记录,但出于测试原因,迁移了
布尔成功=假;
回归成功;
}
私有布尔HandlerResponse(MessageContext MessageContext){
if(log.isDebugEnabled()){
调试(“处理响应(出站)”;
}
布尔成功=假;
ByteArrayOutputStream outputStream=null;
SOAPMessageContext=(SOAPMessageContext)messageContext;
SOAPMessage SOAPMessage=(SOAPMessage)context.getMessage();
试一试{
/*
初始解决方案,但有时会导致:
错误org.apache.axis2.engine.AxisEngine receive-com.sun.xml.messaging.saaj.soap.ver1_1.Body1_1Impl
与com.ibm.ws.webservices.engine.xmlsoap.SOAPBody不兼容
//SOAPBody SOAPBody=soapMessage.getSOAPBody();
//字符串soapBodyXml=soapBody.toString();
*/
//这是可行的-但我希望避免使用SOAPMessage:
outputStream=新的ByteArrayOutputStream();
soapMessage.writeTo(outputStream);
String soapBodyXml=新字符串(outputStream.toByteArray(),“UTF-8”);
if(log.isDebugEnabled()){
log.debug(“responseXml:\n”+soapBodyXml);
}
成功=真实;
}捕获(SOAPE例外){
if(log.isErrorEnabled()){
log.error(“访问SOAPMessage时出错:+e.getMessage());
}
}捕获(IOE异常){
if(log.isErrorEnabled()){
log.error(“soapMessage.writeTo()的IOException:”+e.getMessage());
}
e、 printStackTrace();
}
回归成功;
}
//另一种方法,但也会导致空体:
静态字符串提取PostRequestBody(HttpServletRequest请求){
if(“POST.equalsIgnoreCase(request.getMethod())){
扫描器s=null;
试一试{
s=新扫描仪(request.getInputStream(),“UTF-8”).useDelimiter(\\A”);
}捕获(IOE异常){
e、 printStackTrace();
}
返回s.hasNext()?s.next():“”;
}
返回“”;
}
//另一种方法,但也会导致空体:
私有字符串getRequestBody(HttpServletRequest请求){
HttpServletRequestWrapper请求包装器=
[ch.zek.ecls.EclsPingServiceImpl]: Initialization successful.
EclsPingServiceImpl ping - start ping()...
EclsPingServiceImpl ping - Body: 
EclsPingServiceImpl ping - body2: 
EclsUtil printRequestData - [H] Accept-Encoding: gzip,deflate
EclsUtil printRequestData - [H] Content-Type: text/xml;charset=UTF-8
EclsUtil printRequestData - [H] SOAPAction: ""
EclsUtil printRequestData - [H] Content-Length: 254
EclsUtil printRequestData - [H] Host: localhost:9443
EclsUtil printRequestData - [H] Connection: Keep-Alive
EclsUtil printRequestData - [H] User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
EclsUtil printRequestData - [A] javax.servlet.request.key_size: 128
EclsUtil printRequestData - [A] javax.servlet.request.cipher_suite: SSL_RSA_WITH_AES_128_CBC_SHA
EclsUtil printRequestData - [A] com.ibm.websphere.servlet.uri_non_decoded: /NewZekEclsHTTPRouter/PingService
EclsPingServiceImpl ping - end ping()
public class EclsPingServiceImpl{

@javax.annotation.Resource
WebServiceContext wsContext;

@javax.annotation.Resource
SessionContext sessionContext;

private Log log = LogFactory.getLog(EclsPingServiceImpl.class);

public PingOut ping(PingIn parameters) throws PingEntityNotFoundException, PingPermissionException, PingSystemException {

    MessageContext messageContext = wsContext.getMessageContext();
    HttpServletRequest request = (HttpServletRequest) messageContext.get(MessageContext.SERVLET_REQUEST);

    // start Try 1
    MultiReadHttpServletRequest multiReadHttpServletRequest = new MultiReadHttpServletRequest(request);
    try {
        InputStream bodyInputStream = multiReadHttpServletRequest.getInputStream();
        String body = IOUtils.toString(bodyInputStream);
        if (log.isDebugEnabled()) {
            log.debug("Body: " + body);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // end Try 1

    // start Try 2
    try {
        InputStream body2 = request.getInputStream();
        String xml = IOUtils.toString(body2, "UTF-8");
        if (log.isDebugEnabled()) {
            log.debug("body2: " + xml);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // end Try 2

    // Get Header data:
    Enumeration<String> headerNames = request.getHeaderNames();
    while(headerNames.hasMoreElements()) {
        String headerName = headerNames.nextElement();
        if (log.isDebugEnabled()) {
            log.debug("[H] " + headerName + ": " + request.getHeader(headerName));
        }
    }

    // Get Attribute data:
    Enumeration<String> attributeNames = request.getAttributeNames();
    while(attributeNames.hasMoreElements()) {
        String attributeName = attributeNames.nextElement();
        if (log.isDebugEnabled()) {
            log.debug("[A] " + attributeName + ": " + request.getAttribute(attributeName));
        }
    }

    PingOut pingOut = new PingOut();
    // some irrelevant stuff...

    return pingOut;
}