【问题标题】:WSO2 Mediator Handler for 404 File not Found Exception未找到 404 文件异常的 WSO2 中介处理程序
【发布时间】:2015-01-20 20:23:02
【问题描述】:

我正在使用 WSO2 4.8.1 wso2 ESB。

我开发了一个代理,通过它我可以将请求转发到我的 tomcat 服务器。

我需要处理服务器发送给我的“找不到文件异常”(状态码 404),并且每次都进行一些操作。

这是代理的outSequence的代码:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="addBannedUrl">
   <property xmlns:ns="http://org.apache.synapse/xsd" name="responseStatus" expression="$axis2:HTTP_SC"></property>        
   <filter xmlns:ns="http://org.apache.synapse/xsd" source="get-property('responseStatus')" regex="404">
       <then>         
           <payloadFactory media-type="json">
               <format>         {         "codice":"403",         "message":"FORBIDDEN."         }      </format>
           </payloadFactory>   
           <class name="it.innovapuglia.diogene.integration.wso2.esb.GovernanceClient"></class>
       </then>
  </filter>
</sequence>

我很确定每次tomcat服务器返回的代码是404时WSB都会进入Filter Mediator,但是当它进入payloadFactory时会出现错误:

[2015-01-19 18:05:29,787] ERROR - FilterMediator Error while building message
org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,956]
Message: Il tipo di elemento "HR" deve terminare con la corrispondente tag finale "</HR>".
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
    at org.apache.axiom.om.impl.llom.OMSerializableImpl.build(OMSerializableImpl.java:78)
    at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:722)
    at org.apache.axiom.om.impl.llom.OMElementImpl.detach(OMElementImpl.java:700)
    at org.apache.axiom.om.impl.llom.OMNodeImpl.setParent(OMNodeImpl.java:105)
    at org.apache.axiom.om.impl.llom.OMElementImpl.addChild(OMElementImpl.java:296)
    at org.apache.axiom.om.impl.llom.OMElementImpl.addChild(OMElementImpl.java:212)
    at org.apache.axiom.soap.impl.llom.SOAPBodyImpl.addChild(SOAPBodyImpl.java:231)
    at org.apache.axis2.transport.TransportUtils.createSOAPEnvelope(TransportUtils.java:161)
    at org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:114)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:82)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:68)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
    at org.apache.synapse.mediators.filters.FilterMediator.mediate(FilterMediator.java:160)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:196)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:268)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:488)
    at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:170)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:225)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,956]
Message: Il tipo di elemento "HR" deve terminare con la corrispondente tag finale "</HR>".
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598)
    at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
    at org.apache.axiom.util.stax.dialect.DisallowDoctypeDeclStreamReaderWrapper.next(DisallowDoctypeDeclStreamReaderWrapper.java:34)
    at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.next(XMLStreamReaderWrapper.java:225)
    at org.apache.axiom.util.stax.dialect.SJSXPStreamReaderWrapper.next(SJSXPStreamReaderWrapper.java:138)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:681)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:214)
    ... 29 more

代码有什么问题?

是不是因为tomcat服务器的错误响应信息是这样的?

<html><head><title>Apache Tomcat/7.0.52 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 404 - Not Found</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>Not Found</u></p><p><b>description</b> <u>The requested resource is not available.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.52</h3></body></html>

...esb xml 解析器解析它有一些困难吗? 我怎样才能避免这个异常? 谢谢。

【问题讨论】:

    标签: exception proxy wso2 http-status-code-404 wso2esb


    【解决方案1】:

    您应该能够理解这行提到的错误;

    Message: Il tipo di elemento "HR" deve terminare con la corrispondente tag finale "</HR>".
        at c
    

    顺便说一句,您的外序逻辑是对的吗?我认为您需要将类冥想者放在&lt;then&gt; 标签或&lt;else&gt; 标签中。

    编辑:您能否在axis2.xml 中添加文本/html 消息生成器并检查。

    【讨论】:

    • 是的,你是对的,我在复制原始代理的代码时犯了一个错误。确实,类调解器在 内部(我现在已经更正了第一篇文章,thnx)。顺便说一句,错误仍然不断出现。那么当tomcat捕获“文件未找到异常”时,tomcat发送的标准错误消息中未关闭的hr标记是语法错误吗? - 我没有看到任何。有没有办法让 esb 忽略此消息而不解析它?我只需要构建一个新的自定义消息以在出现 404 错误时发送给类调解器。
    • 这里的错误是 //ERROR - FilterMediator Error while building message//。你能在负载工厂中介之前放置一个日志中介,看看日志是否正在打印?
    • 第一次尝试:我在负载工厂之前添加了一个日志调解器自定义打印响应代码 ---> 它可以工作。 _____ 第二次尝试:我在有效负载工厂设置完整级别()之前添加了一个日志调解器 --->它给了我关于 XMLStreamException 的相同错误。每次 esb 尝试解析响应的 xml 流时,它都会引发异常。正如我在 HTML 中读到的,
      标签没有结束标签。而在 XHTML 中,
      标记必须正确关闭,如下所示:
      在我的工作经验中,我在 esb 日志中多次注意到这种类型的异常有没有办法避免这种情况?
    • OK 所以响应格式中的错误。你能在 ESB 和你的后端(tomcat 服务器)之间保留一个 tcpmon 并检查 tomcat 返回的内容吗?
    • 使用 firebug 并捕获来自服务器的响应,我得到了与之前编写的相同的 html 代码。那是因为tomcat用它的格式封装了自己的响应(简单来说就是tomcat错误页面)。
    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2019-06-04
    • 2023-03-24
    • 2023-03-07
    相关资源
    最近更新 更多