1

如何处理这个异常?如果我在 Content-Type 中发送了错误的编码值 (UTF-88),Mule 会抛出异常而不执行异常流。

WARN 2017-12-22 10:19:55,733 [[2017-mule_api_registry-uni_auth_app].HttpConnectoConfig.worker.02] org.mule.module.http.internal.listener.DefaultHttpListener:解析请求发生异常:java.nio.charset .UnsupportedCharsetException: UTF-88 at java.nio.charset.Charset.forName(Charset.java:531) ~[?:1.8.0_111] at org.mule.transformer.types.SimpleDataType.setEncoding(SimpleDataType.java:89) ~[mule-core-3.9.0.jar:3.9.0] at org.mule.DefaultMuleMessage.updateDataTypeWithProperty(DefaultMuleMessage.java:551) ~[mule-core-3.9.0.jar:3.9.0] at org. mule.DefaultMuleMessage.setProperty(DefaultMuleMessage.java:502) ~[mule-core-3.9.0.jar:3.9.0] at org.mule.DefaultMuleMessage.setProperty(DefaultMuleMessage.java:494) ~[mule-core-3.9 .0.jar:3.9.0] 在 org.mule.DefaultMuleMessage.addProperties(DefaultMuleMessage.java:1398) ~[mule-core-3.9.0.jar:3.9.0] 在 org.mule.DefaultMuleMessage.(DefaultMuleMessage.java:198) ~[mule-core-3.9.0.jar:3.9.0] 在 org.mule.DefaultMuleMessage.(DefaultMuleMessage.java: 175)~[mule-core-3.9.0.jar:3.9.0] 在 org.mule.module.http.internal.listener.HttpRequestToMuleEvent.transform(HttpRequestToMuleEvent.java:128)~[mule-module-http-3.9 .0.jar:3.9.0] 在 org.mule.module.http.internal.listener.DefaultHttpListener.createEvent(DefaultHttpListener.java:187) ~[mule-module-http-3.9.0.jar:3.9.0]在 org.mule.module.http.internal.listener.DefaultHttpListener.access$000(DefaultHttpListener.java:48) ~[mule-module-http-3.9.0.jar:3.9.0] 在 org.mule.module.http .internal.listener.DefaultHttpListener$1.handleRequest(DefaultHttpListener.java:133) ~[mule-module-http-3.9.0.jar:3.9.0] 在 org.mule.module.http.internal.listener.grizzly。GrizzlyRequestDispatcherFilter.handleRead(GrizzlyRequestDispatcherFilter.java:100) ~[mule-module-http-3.9.0.jar:3.9.0] at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) ~[ grizzly-framework-2.3.33.jar:2.3.33] 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) ~[grizzly-framework-2.3.33.jar:2.3.33] 在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) ~[grizzly-framework-2.3.33.jar:2.3.33] at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java :133) ~[grizzly-framework-2.3.33.jar:2.3.33] at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) ~[grizzly-framework-2.3.33.jar: 2.3.33] 在 org.glassfish.grizzly.ProcessorExecutor。执行(ProcessorExecutor.java:77)~[grizzly-framework-2.3.33.jar:2.3.33] at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)~[grizzly-framework -2.3.33.jar:2.3.33] 在 org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) ~[grizzly-framework-2.3.33.jar:2.3.33] 在 org.mule .module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy.run0(ExecutorPerServerAddressIOStrategy.java:119) ~[mule-module-http-3.9.0.jar:3.9.0] 在 org.mule.module.http.internal。 listener.grizzly.ExecutorPerServerAddressIOStrategy.access$100(ExecutorPerServerAddressIOStrategy.java:31) ~[mule-module-http-3.9.0.jar:3.9.0] at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy$ WorkerThreadRunnable.run(ExecutorPerServerAddressIOStrategy.java:142) ~[mule-module-http-3.9.0.jar:3.9.0] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_111] 在 java.util.concurrent .ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_111] 在 java.lang.Thread.run(Thread.java:745) [?:1.8.0_111]

4

2 回答 2

0

在 mule 核心中,有一个类org.mule.transformer.types.SimpleDataType.java负责此异常。方法setEncoding检查字符集的有效性,对于无效字符集,Charset.forname方法抛出UnsupportedCharsetException。为避免这种情况,您可以像这样修改代码块-

public void setEncoding(String encoding)
{
    if (!StringUtils.isEmpty(encoding))
    {
        try {
            // Checks that the encoding is valid and supported
            Charset.forName(encoding);
        }catch(UnsupportedCharsetException e) {
            encoding = "UTF-8";
        }
    }

    this.encoding = encoding;
}

您必须设置默认字符集,否则您无法从 MuleMessage 实例中获取有效负载,例如 -

message.getPayloadAsString();

就我而言,我将其设置为“UTF-8”。您可以根据需要进行设置。

于 2017-12-28T02:27:40.523 回答
0

1.在每个元素中使用 MEL 表达式来测试 Content-Type 标头:

#[message.inboundProperties['Content-Type'].contains('UTF-8')]

2.使用该元素作为开关的默认语句:从那里抛出你的异常。

例如:

 <choice>
     <when expression="#[message.inboundProperties['Content-Type'].contains('??????? your required content type ??????')]">
           <logger message="when number one invoked" level="WARN"/>
      </when>
      <otherwise>
           <logger message="otherwise invoked" level="WARN"/>
      </otherwise>
 </choice>
于 2017-12-25T15:15:30.120 回答