静态使用Dozer Mapper

时间:2013-03-15 10:34:20

标签: jboss mapping dozer stateless-session-bean

只是想知道是否有这样的静态推土机映射器会导致并发错误:

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或在每次调用时创建一个新实例。

2 个答案:

答案 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);