Отображение JavaObject на Javabeans декларативным способом - PullRequest
1 голос
/ 21 июля 2011

Edit1

Я не уверен, что заголовок лучше всего подходит для этой проблемы, поэтому, если какой-либо из них имеет более округленный заголовок, предложите

Я пробую свои силы на верблюде, где мне нужно получить какой-нибудь CSV-файл из файловой системы, и мне нужно преобразовать его в формат XML и поместить в другую систему

Я использую верблюда для этого, и вот мой пример кода POC

import org.apache.camel.CamelContext;

import org.apache.camel.Exchange;

import org.apache.camel.Message;

import org.apache.camel.Processor;

import org.apache.camel.builder.RouteBuilder;

import org.apache.camel.impl.DefaultCamelContext;
import com.poc.convertor.CSVConverterBean;

  public class TestPOC {

           public static void main(String args[]) throws Exception {
           CamelContext context = new DefaultCamelContext();
           context.addRoutes(new RouteBuilder() {

                  public void configure() {
                          from("file:data/csv?noop=true").unmarshal().csv().bean(new CSVConverterBean(),"processCSVInvoice").to("file:data/csvoutput?fileName=test.xml").marshal("jaxb");


                  }

              });
               context.start();
               Thread.sleep(1000);
               context.stop();
          }

}

При таком подходе верблюд csv unmarshaller преобразует файл csv в список java List<List<String>> я написал java-конвертер CSVConverterBean, который будет перебирать список и устанавливать значения в соответствующих java-объектах, генерируемых jaxb 2.x, конечный объект маршалируется в xml и файл сохраняется.

Все работает правильно только с одной проблемой, если в будущем возникнет какой-либо запрос на изменение сопоставления, нам нужно внести изменения в CSVConverterBean, а затем этот Java-файл должен быть перекомпилирован и должен быть перераспределен, что мы хотим чтобы избежать.

мой вопрос: есть ли способ, которым мы можем сопоставить значения из списка java, предоставляемого Camel, с соответствующими классами java, сгенерированными JaxB, чтобы можно было избежать необходимости перекомпиляции кода java.

Ответы [ 3 ]

0 голосов
/ 03 ноября 2011

Используйте идею Бруно, но прочитайте имена свойств из строки заголовка в файле csv.

0 голосов
/ 04 ноября 2011

Я решил эту проблему, используя dom4j.camel, вернул мне csv в виде списка>, и сначала я прочитал заголовки, а затем сделал эти заголовки, теги XML и значения, поскольку во время выполнения учитывались значения.

0 голосов
/ 21 июля 2011

Вы можете предоставить конфигурационный файл типа «от-до» для сопоставления столбцов ваших CSV-данных со свойствами вашего Бина, а также код алгоритма для чтения этого файла и обработки преобразования.

Вы можетесделать с файлом .properties:

# mapping.properties
column0=propertyOne
column1=propertyTwo

Для каждого столбца в CSV вы получите значение из файла свойств и определите, на какое свойство вы должны установить значение.

int columnIndex = 0;
for(String column : csvColumns) {
    String property = findProperty(columnIndex);
    reflectionUtil.setValue(object, property, column);
    columnIndex++;
}

Это может дать вам некоторую подсказку.

Всякий раз, когда ваши данные изменяются, вам нужно будет изменить только файл свойств, а не класс.

...