2009-09-02 1 views
0

Я разрабатываю функциональные возможности, которые могут работать с конкретными компонентами данных, возвращаемыми с помощью Hibernate, или DynaBeans, возвращаемыми с использованием RowSetDynaClass Jakarta Commons/BeanUtils (который обертывает набор результатов JDBC) , RowSetDynaClass по умолчанию заставляет все имена свойств bean использовать нижний регистр, и мне нужно преобразовать все мои конкретные компоненты из Hibernate в DynaBeans с помощью WrapDynaBean. По умолчанию нижняя шкала от RowSetDynaClass кажется хорошей идеей, однако я, возможно, не знаю заранее, как будут имена объектов конкретных бобы; из-за конфигурации Hibernate, их не нужно обставлять одинаково с их соответствующими именами столбцов таблицы.Нужно просто установить все имена свойств DynaBean в нижний регистр

Есть ли встроенная функция для форматирования имен свойств в нижнем регистре с использованием BeanUtils? Я не могу найти его документированным, кроме RowSetDynaClass. Вместо чего-то, встроенного в BeanUtils, может ли кто-нибудь предложить лучший способ добиться этого?

ответ

1

Вот быстрый/грязный метод я придумал в то же время для преобразования DynaBeans на карте, где ключи (String) принуждают в нижний регистр:

private Map asLowerCaseIndexedMap(DynaBean bean) { 
    Map lowerCaseIndexedMap = new HashMap(); 
    DynaProperty[] dynaProperties = bean.getDynaClass().getDynaProperties(); 

    for (int i=0, n=dynaProperties.length; i<n; i++) { 
     String propertyName = dynaProperties[i].getName(); 
     lowerCaseIndexedMap.put(propertyName.toLowerCase(), bean.get(propertyName)); 
    } 

    return lowerCaseIndexedMap; 
} 

К сожалению, это заставило меня подскочить через другие обручи. В то время как я имел дело с бобами таким образом:

public void header(List<DynaBean> headerColumns) throws WriteException { 
    for (DynaBean column : headerColumns) { 
     int col = (Integer)column.get("columnNumber"); 
     int width = (Integer)column.get("columnWidth"); 

    //etcetera 

Теперь я должен сделать это таким образом:

public void header(List<DynaBean> headerColumns) throws WriteException { 
    for (DynaBean column : headerColumns) { 
     /* 
     * RowSetDynaClass returns beans with lower case properties by default 
     * but this is not guaranteed if beans are coming from Hibernate. 
     * 
     * Converting from the bean to a map however loses DynaBeans' inherent 
     * type conversions, which in turn entails the converting back and forth 
     * from String, to BigDecimal, to int as seen below 
     */ 
     Map columnMap = asLowerCaseIndexedMap(column); 

     int col = (new BigDecimal(columnMap.get("columnnbr").toString())).intValue(); 
     int width = (new BigDecimal(columnMap.get("columnwdth").toString())).intValue(); 
1

Я не знаю, как легко это сделать. Потенциально вы можете сделать свое собственное воплощение интерфейса Resolver.

Но в противном случае я бы предложил использовать другие конверсионные рамки, такие как Smooks (http://www.smooks.org/) или Dozer (http://dozer.sourceforge.net).

У бульдозера есть возможность задать подстановочные знаки для свойств. Smooks больше ориентирован на преобразование, поэтому вам нужно будет явно указать все сопоставления полей.

Хотя, у обоих из них есть плагины IDE, которые могут помочь генерировать mappnigs проще и более контролируемым образом.

+0

Было известно о Dozer, но не Smooks, но у меня нет полномочий, чтобы ввести новые библиотеки, и мои начальники ушли на праздник, и они хотят его вчера;) Я отправлю ответ/решение, которое я разработал, не отклонившись от BeanUtils. –

+0

Просто предложение: вы могли бы опубликовать свое решение в качестве ответа на вопрос, но не как редактирование вопроса :) –

+0

Ну, я обычно публиковал свои решения по своим вопросам в качестве ответов раньше, но я противоречил, потому что то может показаться, что я просто «натыкаюсь» на мой вопрос. В этот раз я сделал это как редактирование. –