java - ServiceMIX异常处理

标签 java web-services exception apache-camel

我有一个简单的路线:

public class PartnerRoute extends SpringRouteBuilder
{

    @Value("${comm.async.req.incoming.queue}")
    private String reqInputQueue;

    @Override
    public void configure() throws Exception
    {
        onException(Exception.class)
        .to("activemq:queue:wrongMessages");

        from("cxf:bean:partnerService")
        .log("PartnerData arrived")
        .to("activemq:queue:" + reqInputQueue);

    }
}

如您所见,起点是 CXF Web 服务。 Camel-context.xml中定义的WS

<cxf:cxfEndpoint id="partnerService" 
    address="http://${comm.host}:${comm.port}/cxf/PartnerService" 
    serviceClass="esb.ws.partner.service.PartnerService" />

我想处理 CXF 异常。 (有人用错误的数据调用WS。)

当我使用错误的结构调用 WS 时,出现此错误:

2015-02-26 16:16:44,901 | WARN  | org.apache.cxf.phase.PhaseInterceptorChain | org.apache.cxf.cxf-api | (LogUtils.java:452) | Interceptor for {http://service.partner.ws.esb.ivir.tsm.hu/}PartnerServiceService#{http://service.partner.ws.esb.ivir.tsm.hu/}startMessageProcessing has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"messageFilterx"). Expected elements are <{}messageFilter>,<{}hash>,<{}priority>,<{}referenceNumber>,<{}responseRequired>,<{}requestDate>,<{}messageType>,<{}consumer>,<{}requestor> 
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:881)[139:org.apache.cxf.cxf-rt-databinding-jaxb:2.7.11]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:702)[139:org.apache.cxf.cxf-rt-databinding-jaxb:2.7.11]
    at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:160)[139:org.apache.cxf.cxf-rt-databinding-jaxb:2.7.11]
    at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:192)[135:org.apache.cxf.cxf-api:2.7.11]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)[135:org.apache.cxf.cxf-api:2.7.11]
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)[135:org.apache.cxf.cxf-api:2.7.11]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:355)[157:org.apache.cxf.cxf-rt-transports-http-jetty:2.7.11]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:319)[157:org.apache.cxf.cxf-rt-transports-http-jetty:2.7.11]
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:65)[157:org.apache.cxf.cxf-rt-transports-http-jetty:2.7.11]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1024)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.Server.handle(Server.java:370)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[63:org.eclipse.jetty.aggregate.jetty-all-server:8.1.15.v20140411]
    at java.lang.Thread.run(Thread.java:744)[:1.7.0_51]
Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"messageFilterx"). Expected elements are <{}messageFilter>,<{}hash>,<{}priority>,<{}referenceNumber>,<{}responseRequired>,<{}requestDate>,<{}messageType>,<{}consumer>,<{}requestor>]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:842)[139:org.apache.cxf.cxf-rt-databinding-jaxb:2.7.11]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:101)[139:org.apache.cxf.cxf-rt-databinding-jaxb:2.7.11]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder$2.run(JAXBEncoderDecoder.java:870)
    at java.security.AccessController.doPrivileged(Native Method)[:1.7.0_51]
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:868)[139:org.apache.cxf.cxf-rt-databinding-jaxb:2.7.11]
    ... 25 more
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"messageFilterx"). Expected elements are <{}messageFilter>,<{}hash>,<{}priority>,<{}referenceNumber>,<{}responseRequired>,<{}requestDate>,<{}messageType>,<{}consumer>,<{}requestor>
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:101)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:243)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:176)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360)[84:org.apache.servicemix.bundles.jaxb-impl:2.2.1.1_2]
    ... 31 more
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"messageFilterx"). Expected elements are <{}messageFilter>,<{}hash>,<{}priority>,<{}referenceNumber>,<{}responseRequired>,<{}requestDate>,<{}messageType>,<{}consumer>,<{}requestor>
    ... 42 more

我设置了“onException”,但什么也没发生。

你能帮忙吗,我该如何处理这个异常?

谢谢!

费里

最佳答案

这是先有鸡还是先有蛋的情况。 Camel 使用 onException 或 errorHandler 的错误处理程序是在路由期间。但这需要消费者能够接受传入的消息并创建 Camel Exchange 实例并开始路由消息。

从 stracktrace 来看,情况并非如此,因为 Apache CXF 未能这样做。一些 Camel 组件支持使用 consumer.bridgeErrorHandler=true 选项从消费者错误桥接到 Camel 错误处理程序。不确定 CXF 是否属于这种情况。

关于java - ServiceMIX异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28746530/

相关文章:

java - 如何在android上将数字而不是图标设置为状态栏

java - PipedInputStream、PipedOutputStream 和进程

java - 使用 Java 将文件 .pptx 转换为 .ppt

asp.net - 找不到与具有绑定(bind) WebHttpBinding 的端点的方案 https 匹配的基地址

c# - 使用单个控制台应用程序托管两个 WCF 服务

c# - 在哪里可以找到 SocketException 抛出的 SocketErrorCode 和 NativeErrorCode 列表?

asp.net - System.Runtime.InteropServices.COMException 函数不正确。 (HRESULT : 0x80070001) 的异常

c# - 简单的 LINQ to Entities 更新抛出 'Timeout expired'

java - 动态更改高度约束布局

web-services - 找不到要下载的 Axis 1.4