当将肥皂体添加到网络服务时,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();
}
}
}
}
答案 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