gpt4 book ai didi

java - BeanUtils 中转换器的注册是线程本地的吗?

转载 作者:行者123 更新时间:2023-11-29 05:02:35 27 4
gpt4 key购买 nike

我有一个 Web 项目,其中 BeanUtils 用于操作 bean。

在我的代码中,为了使 BeanUtils 将字符串记录正确地传输到 java.util.Date 字段中,一个 DateConverter 被注册到ConvertUtils 这样的类:

ConvertUtils.register(dateConverter, Date.class);

另外,在我的项目中,不同的Action需要不同的日期格式,所以,我在不同的Action中注册了不同的转换器,比如:

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)的已注册 Converter 会相互替换。所以如果 ConvertUtils.register 操作不是线程本地的,并发引起的问题可能会在这里发生,即使我的网站还没有遇到过。

那么,在一个线程中注册的转换器会替换在另一个线程中注册的转换器吗?如果是这样,我的情况是否有解决办法?

最佳答案

Apache commons beanutils 使用 ContextClassLoaderLocal管理框架的实例。这个概念类似于 ThreadLocal,只是它将一个实例绑定(bind)到线程的上下文类加载器。

因此,当执行 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 并直接使用它。

关于java - BeanUtils 中转换器的注册是线程本地的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578862/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com