1

У меня есть веб-проект, где BeanUtils используется для манипуляции бобами.Реестр преобразователей в BeanUtils thread-local?

В моем коде, для того, чтобы сделать BeanUtils передачи строк записей в java.util.Date полях правильно, DateConverter зарегистрирован в ConvertUtils класс так:

ConvertUtils.register(dateConverter, Date.class); 

Кроме того, в моем проекте, различные форматы даты необходимы в различные действия, поэтому я зарегистрировал различные преобразователи в различных действиях, таких как, что:

public void Action1(){ 
    DateTimeConverter dtConverter = new DateConverter(); 
    dtConverter.setPatterns(dateFormats1); 
    ConvertUtils.register(dtConverter, Date.class); 
    ... 
    BeanUtils.populate(myBean1, hashMap1); 
} 
public void Action2(){ 
    DateTimeConverter dtConverter = new DateConverter(); 
    dtConverter.setPatterns(dateFormats2); 
    ConvertUtils.register(dtConverter, Date.class); 
    ... 
    BeanUtils.populate(myBean2, hashMap2); 
} 

Но позже я заметил, что зарегистрированный конвертер с одной целью класс (Date здесь) заменит друг друга. Так что если операция ConvertUtils.register не является локальной, проблемы, вызванные совпадением, могут произойти здесь, даже через мой веб-сайт еще не встретился.

Итак, будет ли конвертер зарегистрирован в одном потоке заменить конвертер, зарегистрированный в другом потоке? Если да, есть ли какая-нибудь работа для моих обстоятельств?

ответ

3

Apana commons beanutils использует ContextClassLoaderLocal для управления экземплярами фреймворка. Концепция похожа на ThreadLocal, за исключением того, что она привязывает экземпляр к загрузчику классов контекста потока.

Итак, когда нити, которые выполняют Action1 и Action2, используют один и тот же загрузчик классов контекста, а изменение на ConverterUtils в одном действии повлияет на другое.

Чтобы быть в безопасности, вы можете использовать собственный экземпляр BeanUtilsBean в каждом действии, например.

public void Action1(){ 
    BeanUtilsBean beanUtils = new BeanUtilsBean(); 
    ConvertUtilsBean convertUtils = beanUtils.getConvertUtils(); 
    DateTimeConverter dtConverter = new DateConverter(); 
    dtConverter.setPatterns(dateFormats1); 
    convertUtils.register(dtConverter, Date.class); 
    ... 
    beanUtils.populate(myBean1, hashMap1); 
} 

Конечно, было бы лучше, чтобы настроить BeanUtilsBean один раз в конструкторе класса и просто использовать его.

+0

Ну, в коде все еще есть небольшая проблема, строка 6 должна быть 'beanUtils .getyConvertUtils(). Register (...)' to work –

+0

Но 'convertUtils' является результатом' beanUtils.getConvertUtils() '. Я что-то пропустил? –

+0

О, извините, вы правы, я пропустил эту модификацию –