Camel :: Generic List <enum> Converter

时间:2016-12-27 12:14:25

标签: java generics apache-camel

情况:

@Handler
public void handle(@Header("type") List<ListingType> listingType) {
    System.err.println(listingType);
}

...

public enum ListingType {
    TYPE_A,
    TYPE_B
}

如果listingType的值是某个不代表Enum值的String,Camel会将其解析为List&lt; String&gt ;.

例如,如果listingType =“foo”

System.err.println(listingType);
=> ["foo"]

我尝试使用自定义FallBackConverter

@FallbackConverter
public static <T> Object convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
    Class<?> concreteClass = ...
    if (List.class.isAssignableFrom(type) && concreteClass.isEnum()) {
        ...
    }
}

但是如何获得列表的具体泛型类型?

编辑:

或者是否有其他解决方案将String转换为具体的枚举列表?

2 个答案:

答案 0 :(得分:1)

您无法在运行时执行此操作。 Java中的泛型仅在编译阶段出现,并且无论如何都不会对程序产生影响。

Here您可以阅读有关泛型的更多信息。

答案 1 :(得分:0)

我不知道你为什么要保留一个字符串列表而不是正确的枚举值。
我会尝试在处理之前显式转换标题。

<route>
    <from uri="direct:yourRoute">
    <to uri="bean:preprocessHeader" /> <!-- this converts the header to enum -->
    <to uri="bean:handle" /> <!-- this is your bean/method -->
</route>

使用类似

的方法定义preprocessHeader bean
public process(Exchange exchange) {
    List<String> stringHeader = (List<String>)exchange.getIn().getHeader("type", List.class);

    List<ListingType> enumHeader = new ArrayList<>(stringHeader.size());

    for (String h : stringHeader) {
        try {
            ListingType t = ListingType.valueOf(h);
            enumHeader.add(t);
        } carch (IllegalArgumentException e) {
            // Handle the case where the string is not a proper enum value
            enumHeader.add(ListingType.UNKNOWN);
        }
    }

    exchange.getIn().setHeader("type", enumHeader);
}

代码未经测试。