我正在考虑实现一个集成场景,我需要执行从源到目标的动态映射,问题是映射应该是相当可配置的,并且不能链接到固定值。
我使用Camel作为集成框架并导入文件(可以有不同的数据结构,但我们假设它是一个CSV文件)然后我需要将文件中的数据映射到内部格式。我正在寻找使用Dozer和XML映射配置来执行此映射。
所以我要做的是加载文件,解组CSV然后拆分文件然后我想将驼峰体中的HashMap(由CSV unmarshal生成)映射到另一个hashMap但是更改值的钥匙。
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd“>
<bean id="Debug" class="com.mycompany.camel.spring.DebugProcessor" />
<bean id="dozerConverterLoader"
class="org.apache.camel.converter.dozer.DozerTypeConverterLoader" />
<bean id="DynamicMapper" class="org.dozer.DozerBeanMapper">
<property name="mappingFiles">
<list>
<value>Mapping.xml</value>
</list>
</property>
</bean>
<camelContext trace="false"
xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:src?fileName=sample_data.csv&noop=true" />
<unmarshal>
<csv delimiter="," skipHeaderRecord="true" useMaps="true" />
</unmarshal>
<split>
<simple>${body}</simple>
<bean ref="Debug" />
<bean ref="DynamicMapper" />
<bean ref="Debug" />
</split>
</route>
</camelContext>
映射文件如下所示(纯粹作为一个例子,这显然会随着更多的字段映射而扩展)
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>java.util.HashMap</class-a>
<class-b>java.util.HashMap</class-b>
<field>
<a key="overtimehours">this</a>
<b key="OVT_HRS">TargetMap</b>
</field>
</mapping>
</mappings>
然而,当我执行camel路由时,我继续获得异常“org.dozer.MappingException:Destination class不能为null”
我做错了什么?我们也欢迎任何其他建议来实现动态映射功能。
答案 0 :(得分:0)
我不确定您是否可以直接引用dozerBeanMapper类来调用特定的映射。您可以使用<convertBodyTo type="Hashmap"/>
,但由于它已经是HashMap,我不知道这是否有用。你能在目标类型的hashmap周围放一个包装器然后使用<convertBodyTo type="newWrapperClass"/>
吗?