camel typeconverter仍然抛出NotTypeConversionAvailableException,即使在@converter注解中将allownull设置为true

wnavrhmk  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(200)

我正在使用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(我可以这样做)值,以便我的路由不会在转换发生的地方中断?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题