簡體   English   中英

駱駝::通用列表 <Enum> 轉換器

[英]Camel :: Generic List<Enum> Converter

情況:

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

...

public enum ListingType {
    TYPE_A,
    TYPE_B
}

如果listingType的值是某個String,但不表示Enum的值,則Camel會將其解析為List <String>。

例如,如果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轉換為枚舉的具體列表?

您無法在運行時執行此操作。 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);
}

代碼未經測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM