我正在使用ApacheCXF开发web服务项目。我不想处理异常和定制响应:
public class FaultInterceptor extends
AbstractSoapInterceptor {
public FaultInterceptor() {
super(Phase.MARSHAL);
}
public void handleMessage(SoapMessage soapMessage) throws Fault {
Fault fault = (Fault) soapMessage.getContent(Exception.class);
QName faultCode = new QName("11111");
fault.setFaultCode(faultCode);
所以这是我在回复中得到的:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:11111</faultcode>
<faultstring>Message</faultstring>
</soap:Fault>
</soap:Body>
如何删除文本“soap:”而只留下11111?
请帮助我,并提前感谢
我一直在寻找完全相同的东西,因为迁移了一个旧系统,使其行为完全相同。
我想出了以下解决方案。
class SoapFaultEndpointInterceptor extends EndpointInterceptorAdapter
{
private static final Pattern SOAP_CODE_FAULT_SPLITTER = Pattern.compile(":");
@Override
public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception
{
SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
modifySoapFaultCode(soapResponse);
return super.handleFault(messageContext, endpoint);
}
private void modifySoapFaultCode(SaajSoapMessage soapResponse)
{
try {
SOAPMessage soapMessage = soapResponse.getSaajMessage();
SOAPBody body = soapMessage.getSOAPBody();
SOAPFault soapFault = body.getFault();
modifyFaultCodeIfPresent(soapFault);
} catch (SOAPException e) {
throw new SoapModifiyingException("Modifying faultcode did not work properly.", e);
}
}
private void modifyFaultCodeIfPresent(SOAPFault fault)
{
if (fault != null) {
String newFaultCode = cleanFaultCode(fault.getFaultCode());
fault.setFaultCode(newFaultCode);
}
}
private String cleanFaultCode(String oldFaultCode)
{
String[] cleanFaultCode = SOAP_CODE_FAULT_SPLITTER.split(oldFaultCode);
Assert.isTrue(cleanFaultCode.length == 2, "No proper faultcode provided!");
return cleanFaultCode[1].trim();
}
通过将SoapFaultEndpoint Intericetor
添加到您的拦截器,它应该可以工作。
@EnableWs
@Configuration
public class SoapServerConfig extends WsConfigurerAdapter
{
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors)
{
interceptors.add(new SoapFaultEndpointInterceptor());
}
}
要自定义SOAP响应,可以实现以下任一项:
-编辑2019-02-20 -
根据Javadoc(和SOAP规范),错误代码必须采用“prefix:localname”的形式,其中“前缀”是XML中声明的XML命名空间的前缀,或者你可以没有你想要的前缀,如果它被声明为默认命名空间,例如xmlns=“my-custom-faultcode-namespace-uri”
,例如在soap:Envelope元素中。因此,一种方法 - 不确定它是最简单的,但它符合 SOAP 标准 - 包括:
1)为此错误代码创建自己的自定义命名空间
2) 尝试使用空字符串作为命名空间前缀来更改QName:
QName faultCode = new QName("my-custom-faultcode-namespace-uri", "11111", "");
如果这还不够(我会很惊讶它这么简单),您可能会强制CXF使用您的自定义名称空间作为默认名称空间(不带前缀)。根据这篇文章,要在CXF中定制soap信封上的名称空间和前缀,需要更改jaxws的soap.env.ns中的Map。map”属性。
如果有人能分享他解决以下问题的经验,我将不胜感激。我在JDK实现中有一个SOAP服务(我相信这就是Metro)。 出于日志记录的目的,我们需要提取传入请求和生成响应的正文。我试图通过在服务器端实现SOAPHandler来获取它。我将处理程序配置为Spring bean。我找到的所有示例基本上都复制了Oracle留档:https://docs.oracle.com/cd/E23943_01/web.
问题内容: 目标 我正在为相当老的(但可悲的是不可更改)的接口实现Web服务。我有一个问题,正在调用我的服务的客户端期望SOAP响应中有某个命名空间,而我很难更改它以使其匹配。 考虑一个世界的例子,我想要这样: 看起来像这样: 我在这里找到了与尝试执行的操作类似的操作,但是在使相似的代码正确执行方面遇到困难。(我想坚持使用Metro,而不必更改为cxf或axis) 执行 我的实现返回如下所示: 该
我使用apache cxf编写了一个示例soap服务项目,并在此应用程序中使用log4j with进行日志记录。我可以将soap原始请求和响应记录到服务器控制台,但无法将其记录到日志文件或stingBuilder。和我的cxf bean。像这样的xml ** 客户端类 记录器。信息(“请求”客户端。getInInterceptors()。添加(new LoggingInInterceptor())
第一特征给定ur“” def有效负载=read(") 请求有效载荷 肥皂行动" 值= /Envelope/Body/Response/Result/Num print value#按预期正确打印值 second.feature背景:*def fetch=read('first.feature')*def data=call fetch 情景: 打印数据。response#以json格式打印soap
问题内容: 我想记录来自某个特定端点的所有传入请求和响应,并进行内容过滤。即当我有这样的要求时: 我想过滤它,以便它看起来像这样的日志 或完全删除了m:Photo元素。 我发现CXF有一些LoggingInInterceptor和LoggingOutInterceptor,我可以编写自己的拦截器来做到这一点。但是,这需要做一些工作,所以我的问题是:您知道什么更好的即用型解决方案吗? 问题答案: 我