使用apache调用webservice时肥皂体空白cxf api

时间:2016-01-18 06:08:04

标签: java web-services soap wsdl cxf

当将肥皂体添加到网络服务时,Iam面临问题。我使用apache cxf api。 在调用webservice时,我看到soap body被生成为空白。 我使用下面的代码:

 GetPDFDocumentRequest request = new ObjectFactory().createGetPDFDocumentRequest();
    request.setCrid(reference);
    request.setResourceId(confirmationId);
    request.setVersion(Integer.parseInt(version));
    request.setDocType(pdfType);
    String encryptedString  = svc().getPDFDocument(request).getDocument();

虽然我从GetPDFDocumentRequest打印值。所有值:crid,resourceid,version和doctype都有值,但我没有看到它附加在soap body中如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"></env:Header><soap:Body><ns2:GetPDFDocumentRequest xmlns="http://test.fm.com/Static/interface" xmlns:ns2="https://test.fm.grp.net/style/webservices/schemas/messages" xmlns:ns3="http://test.fm.com/EventML" xmlns:ns4="http://test.fm.com/StyleML" xmlns:ns5="http://test.fm.com/odc" xmlns:ns6="https://test.fm.rbsgrp.net/test/lifecycle/schemas/types" xmlns:ns7="https://test.fm.rbsgrp.net/style/persistence/schemas/types" xmlns:ns8="http://test.fm.com/Reporting/interface" xmlns:ns9="http://test.fm.com/ConfigML"/></soap:Body>

我在maven中使用下面的api:

<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.7.4</version>
</dependency> 

我甚至添加了cxf-rt-frontend-jaxrs,但在使用它之后也没有成功。

拦截器代码:

import java.io.OutputStream;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.io.CacheAndWriteOutputStream;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.io.CachedOutputStreamCallback;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LogInterceptor extends LoggingOutInterceptor {

     private Logger logger = Logger.getLogger(LogInterceptor.class);
    public LogInterceptor() {
        super(Phase.PRE_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        OutputStream out = message.getContent(OutputStream.class);
        final CacheAndWriteOutputStream newOut = new CacheAndWriteOutputStream(out);
        message.setContent(OutputStream.class, newOut);
        newOut.registerCallback(new LoggingCallback());
    }

    public class LoggingCallback implements CachedOutputStreamCallback {
        public void onFlush(CachedOutputStream cos) {
        }

        public void onClose(CachedOutputStream cos) {
            try {
                StringBuilder builder = new StringBuilder();
                cos.writeCacheTo(builder, limit);
                String soapXml = builder.toString();
                logger.log(Level.INFO, "SOAP XML SENT TO STYLE" + soapXml);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

通过检查java代码中的请求POJO,您将无法看到SOAP正文/包装元素。这是因为如果CXF在框架级别发送请求之前将请求包装在SOAP主体中。它对程序员是透明的,不能在java代码中查看。

但是,如果您真的想查看并拦截原始消息,请尝试使用“JAXWS处理程序”或其等效的“CXF拦截器”。

更重要的是,除非您需要进行一些特殊的前/后处理或按摩数据,否则您不需要拦截以查看SOAP正文。否则,只需使用Java类中的服务方法,将数据读取或写入CXF wsgen创建的POJO就足以满足大多数实际需要。

<强>更新 我发现了一个与你的问题完全相同的CXF JIRA问题。 它为最终解决您的问题提供了解决方案 - 我认为最有可能也是您的解决方案。这是JIRA链接 - https://issues.apache.org/jira/browse/CXF-2405