情况:
@Handler
public void handle(@Header("type") List<ListingType> listingType) {
System.err.println(listingType);
}
...
public enum ListingType {
TYPE_A,
TYPE_B
}
如果ListingType的值是不代表枚举值的字符串,则骆驼将其解析为list&lt; string>。
例如,如果listingtype =" foo"
System.err.println(listingType);
=> ["foo"]
我用自定义的后卫conterterter
尝试了@FallbackConverter
public static <T> Object convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
Class<?> concreteClass = ...
if (List.class.isAssignableFrom(type) && concreteClass.isEnum()) {
...
}
}
但是如何获得列表的具体通用类型?
编辑:
或其他解决方案将字符串转换为枚举的具体列表?
您在运行时不能这样做。Java中的仿制药仅在编译阶段出现,并且不会影响该程序。
在这里您可以阅读有关仿制药的更多信息。
我不知道为什么您首先保留字符串列表,而不是正确的枚举值。
我会尝试在处理标题之前显式转换标题。
<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);
}
代码未测试。