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

Apache CXF:获取XML请求导致错误

汪天宇
2023-03-14

我有一个webservice,它需要某种请求格式。发送无效的请求格式时,出现以下错误:

<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: unexpected element (uri:"", local:"aaaa"). Expected elements are &lt;{}xxx>,&lt;{}yyy></faultstring>

发生这种情况时,我需要发送一封电子邮件。在这封电子邮件中,我需要传入的请求(我发送到webservice的XML)。

我尝试实现CXF拦截器:

public class ExceptionInterceptor extends AbstractSoapInterceptor {

    /**
     * Logger
     */
    private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionInterceptor.class);

    /**
     * Constructeur
     */
    public ExceptionInterceptor() {
        super(Phase.PRE_LOGICAL);
    }

    public void handleMessage(SoapMessage message) throws Fault {
        Fault fault = (Fault) message.getContent(Exception.class);
        Throwable ex = fault.getCause();

        if (ex instanceof UnmarshalException) {
            LOGGER.error("Error in incoming message", ex);

            // TODO : send email
        }
    }
}

但是如何在此处获取发送到webservice的原始消息?Apache CXF拦截器没有太多文档记录:(

提前感谢!

Hejk公司

共有1个答案

耿珂
2023-03-14

您可以使用默认的CXF记录器LoggingInInterceptorLoggingOutInterceptor记录肥皂消息,或使用自定义拦截器提取有效负载

// output log using log4j
//LogUtils.setLoggerClass(org.apache.cxf.common.logging.Log4jLogger.class);
yourService = new YourService(wsdlURL, SERVICE_NAME);
port = yourService.getServicePort(); 

Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor());

消息将通过控制台写入。您可以使用log4j或配置java。util。日志记录。在此处查看更多示例

public class MyInterceptor extends AbstractPhaseInterceptor<Message> {
    public MyInterceptor () {
        super(Phase.RECEIVE);
    }

    public void handleMessage(Message message) {
        //Get the message body into payload[] and set a new non-consumed  inputStream into Message
        InputStream in = message.getContent(InputStream.class);
        byte payload[] = IOUtils.readBytesFromStream(in); 
        //log payload...
        ByteArrayInputStream bin = new ByteArrayInputStream(payload);
        message.setContent(InputStream.class, bin);
    }

    public void handleFault(Message messageParam) {
        //Invoked when interceptor fails
    }
}

以编程方式添加拦截器

 WebClient.getConfig(client).getOutInterceptors().add(new MyInterceptor());
 类似资料:
  • 我有一个jersey服务器的例子,它适用于XML,但不适用于JSON。 如果我将此xml请求作为发送到服务器,则一切正常, 作为) 我在utilities-online.info将其翻译为JSON,并将其作为发送到相同的URL,具有相同的参数,但收到错误“400错误请求” 环境: Tomcat 7 球衣2.17 我尝试过的: 将添加到init-参数 启用init-参数为 添加了依赖项//

  • 问题内容: 我可以使用Groovy脚本获取响应xml。我需要获取请求XML,因为我需要在soap ui测试中添加“断言脚本”。 我正在使用以下代码来获取响应xml 但是我不确定如何获取SOAPUI的请求xml。谁能帮我获得SOPAUI的请求xml吗? 问题答案: 要以字符串形式获取请求内容,可以使用 有关SoapUI API的更多信息,请访问http://www.soapui.org/apidoc

  • 问题内容: 有什么方法可以单独使用wsdl(url)获得样本请求xml? 以下是wsdl示例:http : //www.webservicemart.com/uszip.asmx? WSDL 示例请求: 我知道那里有SOAPUI等工具,其他工具也可以做到这一点。但是,如果不使用这些工具,还有其他方法可以使用Java实现吗? 使用wsimport将是让我获得Java源码的一种选择,这是更静态的。有没

  • 在做了一些研究后,我发现这是一个CORS问题。我正在使用谷歌应用程序引擎与Python。这个错误是我可以修复的,还是API的bug?我已经设法用这个API做了一个POST请求,没有问题。我已经阅读了很多关于CORS的信息,但还没有找到解决这个问题的方法。 下面是GET请求的Javascript代码,它只是从Trello API复制/粘贴的,所以我不确定哪里出了问题:

  • 问题内容: 我正在尝试调试我写的一个简单REST库时遇到的非常异常的错误。 我使用标准的net / http包发出Get,Post,Put,Delete请求,但是当我连续发出多个请求时,我的测试有时会失败。我的测试看起来像这样: 我正在这样请求: 有时它可以工作,但是大多数时候我会出现1或2个失败: 当我提出多个请求时,就会发生失败。如果我注释掉除PUT请求之外的所有内容,则测试将始终通过。一旦包

  • 我已经尝试了几次迭代,并搜索了所有的示例代码。对于如何提出成功的请求有什么想法吗?TIA