簡體   English   中英

BeanUtils中的轉換器寄存器是否為本地線程?

[英]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除了它將實例綁定到線程的上下文類加載器。

所以,當線程執行Action1Action2共享相同的上下文類加載器更改為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM