如何获取泛型类型作为交换输入体而不是强制转换?

Md *_*ain 5 java spring apache-camel

Apache camel 中,可以通过将其类型传递到exchange.getIn().getBody(Class<T> type). 假设我们想要获取消息正文String,如下所示:

String body = exchange.getIn().getBody(String.class);
Run Code Online (Sandbox Code Playgroud)

GenericorParameterized类型消息的情况下,我们如何通过它自己的类型而不是传统的对象类型转换来获取对象。这是您实现的伪代码片段:

package com.chorke.hmis.fusion.epoint;

import java.util.ArrayList;
import java.util.HashMap;

import org.apache.camel.Exchange;
import org.springframework.stereotype.Component;

@Component("chorkeProcessor")
public class ChorkeProcessorImpl implements ChorkeProcessor{

    @Override
    public void process(Exchange exchange) throws Exception {
        ArrayList<HashMap<String, Object>> list = null;
        list = exchange.getIn().getBody(ArrayList<HashMap<String, Object>>.class);

        for (HashMap<String, Object> map : list) {
            for (String key : map.keySet()) {
               Object value= map.get(key);
               //TODO
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的期望与示例一样。

Mil*_*vić 6

它根本无法完成,没有ArrayList<HashMap<String, Object>>.class类,类始终是一个简单的ArrayList.class,这就是 Java 泛型类型的工作方式。你要么必须使用普通的ArrayList

@Component("chorkeProcessor")
public class ChorkeProcessorImpl implements ChorkeProcessor{

    @Override
    public void process(Exchange exchange) throws Exception {
        ArrayList<HashMap<String, Object>> list =  exchange.getIn().getBody(ArrayList.class);

        for (HashMap<String, Object> map : list) {
            for (String key : map.keySet()) {
               Object value= map.get(key);
               //TODO
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或定义并使用您自己的仅扩展类型ArrayList<HashMap<String, Object>>

// MyListOfMaps.java
public class MyListOfMaps extends ArrayList<HashMap<String, Object>> {
    // constructors, additional methods
}

// ChorkeProcessorImpl.java
@Component("chorkeProcessor")
public class ChorkeProcessorImpl implements ChorkeProcessor{

    @Override
    public void process(Exchange exchange) throws Exception {
        MyListOfMaps list =  exchange.getIn().getBody(MyListOfMaps.class);

        for (HashMap<String, Object> map : list) {
            for (String key : map.keySet()) {
               Object value= map.get(key);
               //TODO
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不自己创建地图列表,则应谨慎使用此方法 - 您可能需要提供适当的转换器

  • “没有 ArrayList&lt;HashMap&lt;String, Object&gt;&gt;.class 类”--&gt; 实际上,您可以使用 TypeToken ( https://github.com/google/guava/wiki/ReflectionExplained#typetoken ) 创建这样一个类,但我不知道 Camel 是否支持开箱即用。 (3认同)
  • 恐怕你不能,TypeToken 只是一个抽象,它允许你做 Java 本身不支持的事情,但 TypeToken 不是一个类,不能在需要类的地方使用 (2认同)