当前位置: 首页 > 知识库问答 >
问题:

定制皂响应

姬熙云
2023-03-14

我正在使用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?

请帮助我,并提前感谢

共有2个答案

严恩
2023-03-14

我一直在寻找完全相同的东西,因为迁移了一个旧系统,使其行为完全相同。

我想出了以下解决方案。

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());
    }
}
翟越
2023-03-14

要自定义SOAP响应,可以实现以下任一项:

  • JAX-WS处理程序;
  • CXF拦截器(扩展AbstractSoapIntericetor);
  • Servlethtml" target="_blank">过滤器。

-编辑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,我可以编写自己的拦截器来做到这一点。但是,这需要做一些工作,所以我的问题是:您知道什么更好的即用型解决方案吗? 问题答案: 我