如何处理此异常?如果我在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:java.nio.charset.Charset.forName(Charset.java:531)〜[?:1.8.0_111]的UTF-88 at org.mule.transformer.types.SimpleDataType.setEncoding(SimpleDataType.java:89) 〜[mule-core-3.9.0.jar:3.9.0] 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] atg.mule.DefaultMuleMessage.setProperty(DefaultMuleMessage.java:494)〜[mule-core-3.9 .g.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] at 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] at org。 mule.module.http.internal.listener.DefaultHttpListener.access $ 000(DefaultHttpListener.java:48)〜[mule-module-http-3.9.0.jar:3.9.0] at org.mule.module.http.internal。 listener.DefaultHttpListener $ 1.handleRequest(DefaultHttpListener.java:133)〜[mule-module-http-3.9.0.jar:3.9.0] at 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)〜[grizzl y-framework-2.3.33.jar:2.3.33] at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)~ [grizzly-framework-2.3.33.jar:2.3.33] at at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)〜[grizzly-framework-2.3.33.jar:2.3.33] org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java) :org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)〜[grizzly-framework-2.3.33.jar:2.3。 33] 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)〜 [orle.mu的[mule-module-http-3.9.0.jar:3.9.0] le.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy.access $ 100(ExecutorPerServerAddressIOStrategy.java:31)〜[mule-module-http-3.9.0.jar:3.9.0] atg.mule.module.http。 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java)中的internal.listener.grizzly.ExecutorPerServerAddressIOStrategy $ WorkerThreadRunnable.run(ExecutorPerServerAddressIOStrategy.java:142)~ [mule-module-http-3.9.0.jar:3.9.0] :1142)[?:1.8.0_111] java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[?:1.8.0_111] at java.lang.Thread.run(Thread.java:745 )[?:1.8.0_111]
1.在每个元素中使用MEL表达式来测试Content-Type标头:
#[message.inboundProperties [ '内容 - 类型']。包含( '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>
在mule核心中,有一个类org.mule.transformer.types.SimpleDataType.java,它负责此异常。方法setEncoding检查charset的有效性,对于无效的charset,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'。您可以根据需要进行设置。