[英]Are register of Converters in BeanUtils thread-local?
我有一個Web項目,其中BeanUtils
用於處理bean。
在我的代碼中,為了使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
操作不是本地線程,則可能會發生由並發引起的問題,即使我的網站還沒有遇到任何問題。
那么,轉換器會在一個線程中注冊替換轉換器在另一個線程中注冊? 如果是這樣,我的情況有什么工作嗎?
Apache 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
並使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.