只是想知道是否有这样的静态推土机映射器会导致并发错误:
public static Mapper mapper = new DozerBeanMapper();
public static MyDTO toDTO(MyEntity e) {
MyDTO dto = mapper.map(e, MyDTO.class);
return dto;
}
或者我应该始终使用此代码:
public static MyDTO toDTO(MyEntity e) {
Mapper mapper = new DozerBeanMapper();
MyDTO dto = mapper.map(e, MyDTO.class);
return dto;
}
该方法用于JBoss Server的@Stateless会话bean,可以同时访问。事实是我真的不知道Dozer是否在库中使用静态变量或实例变量来决定我是否可以/应该使用静态Mapper或在每次调用时创建一个新实例。
答案 0 :(得分:5)
Dozer实例可能是静态的。如果要为每个请求创建新实例,性能会更差,因为每次都会初始化大量缓存。由于自定义转换器中的错误或内部Dozer问题,可能会遇到ConcurrencyErrors。
答案 1 :(得分:1)
从documentation开始,DozerMapper实例应该构建为单例。 DozerBeanMapper是线程安全的,因此您可以在任何风险下使用多个线程。
确保您也可以使用DozerBeanMapperSingletonWrapper.getInstance();
这将为您处理单身部分。
我认为将mapper用作公共静态字段并不是一个好主意。
您还可以使用Selma来处理您的映射。这是一个基于Annotation处理器的新库,它在编译时生成映射代码。有了它,您的代码将如下所示:
// Configure the mapping
@Mapper
public interface DtoMapper {
MyDTO toDTO(MyEntity e);
}
// Retrieve the mapper
public static DtoMapper mapper = Selma.getMapper(DtoMapper.class);
// and some where in the code use
mapper.toDto(entity);