我正在使用ApacheCamel 3.4.3,并尝试为我的camel路由转换空值
from(endpointURI)
.convertBodyTo(DataContainer.class)
.to(DIRECT_ROUTE)
使用如下自定义类型转换器:
@Converter(allowNull = true)
public DataContainer toDataContainer(String xml) {
LOGGER.info("Received body as string [{}] try to convert to DataContainer", xml);
if (StringUtils.isBlank(xml)) {
return null;
}
if (!XmlUtils.isXml(xml)) {
throw new SwiftCorpException(ErrorCode.ERROR_99999,
String.format(
"value [%s] is not a xml, so it cannot be converted to DataContainer",
xml
)
);
}
return DataContainer.fromXml(xml);
}
但这种方式引发了例外:
org.apache.camel.invalidpayloadexception:没有类型为ru.swiftcorp.common.utils.datacontainer的可用正文,但在消息上具有类型为java.lang.string的值。原因:没有类型转换器可用于将类型:java.lang.string转换为所需类型:ru.vtb.swiftcorp.common.utils.datacontainer(带值)。交换[]。原因:[org.apache.camel.notypeconversionavailableexception-没有类型转换器可用于将类型:java.lang.string转换为所需类型:ru.swiftcorp.common.utils.datacontainer with value]
我开始调试,发现当@converter注解中的allownull设置为true时,这将导致在 CoreTypeConverterRegistry
类内部方法 public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws NoTypeConversionAvailableException
:
public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws NoTypeConversionAvailableException {
...
Object answer = doConvertTo(type, exchange, value, true, false);
if (answer == null) {
// Could not find suitable conversion
throw new NoTypeConversionAvailableException(value, type);
}
return (T) answer;
}
这里的答案是null,下一步notypeconversionavailableexception抛出。
但是ApacheCamel说接下来(这里有一个链接):
如果允许null作为有效响应,则从camel 2.11.2/2.12开始,您可以在注解中指定此值,如图所示
所以我的问题是如何在类型转换器中返回null(我可以这样做)值,以便我的路由不会在转换发生的地方中断?
暂无答案!
目前还没有任何答案,快来回答吧!