2015-12-14 5 views
0

Я рассматриваю реализацию сценария интеграции, когда мне нужно выполнить динамическое сопоставление от источника к цели, проблема в том, что сопоставление должно быть достаточно конфигурируемым и не может быть связано с фиксированными значениями.Динамическое сопоставление в Dozer и Camel

Я использую Camel как инфраструктуру интеграции и импортирую файл (может иметь другую структуру данных, но мы предполагаем, что это файл CSV), тогда мне нужно сопоставить данные из файла во внутренний формат. Я рассматриваю использование Dozer и конфигурацию отображения XML для выполнения этого сопоставления.

Итак, что я хочу сделать, это загрузить файл, развязать CSV, а затем разбить файл, а затем я хотел бы сопоставить HashMap (полученный из CSV unmarshal) в теле верблюда другому хэш-карте, но изменить значения ключей.

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://camel.apache.org/schema/springhttp://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&amp;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> 

Однако, когда я выполняю t он верблюд-маршрут, я продолжаю получать исключение "org.dozer.MappingException: Destination class не должен быть нулевым"

Что я делаю неправильно? и любые другие предложения также приветствуются для достижения функциональности динамического сопоставления.

+0

вам необходимо показать код вашего динамического картографа, который является кодом dozer, который не работает. Также прочитайте бульдозерный документ о том, что означает эта ошибка на бульдозерах. –

ответ

0

Я не уверен, что вы можете напрямую ссылаться на класс dozerBeanMapper для вызова определенного отображения. Вы можете использовать <convertBodyTo type="Hashmap"/>, но поскольку его уже HashMap я не знаю, будет ли это работать. Не могли бы вы поместить обертку вокруг хэш-карты для целевого типа, а затем использовать <convertBodyTo type="newWrapperClass"/>?

Смежные вопросы