Orika Mapper - MapperFacade 初始化后无法注册转换器
Orika Mapper - Cannot register converters after MapperFacade has been initialized
我在 spring 引导应用程序中使用 Orika Mapper API 创建了一个 class 来复制 bean 属性,如下所示:
public class ObjectMapper {
private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
public static ClientEntity toClientEntity(ClientDTO clientDTO) {
BoundMapperFacade<ClientDTO, ClientEntity> boundMapper = mapperFactory.getMapperFacade(ClientDTO.class, ClientEntity.class);
return boundMapper.map(clientDTO);
}
public static UserEntity toUserEntity(UserDTO userDTO) {
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class));
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalTime.class));
BoundMapperFacade<UserDTO, UserEntity> boundMapper = mapperFactory.getMapperFacade(UserDTO.class, UserEntity.class);
return boundMapper.map(userDTO);
}
}
UserEntity 和 UserDTO POJO classes 具有 JAVA 8 个 LocalDate 和 LocalTime 属性,因此为 mapperFactory 注册了转换器。这第一次工作正常,但在连续调用时会抛出以下异常:
java.lang.IllegalStateException: Cannot register converters after MapperFacade has been initialized
at ma.glasnost.orika.converter.DefaultConverterFactory.registerConverter(DefaultConverterFactory.java:192) ~[orika-core-1.4.6.jar:na]
at ma.glasnost.orika.impl.DefaultMapperFactory$ConverterFactoryFacade.registerConverter(DefaultMapperFactory.java:1614) ~[orika-core-1.4.6.jar:na]
我理解这是因为转换器在 MapperFacade 初始化后被注册。如何解决这个问题?如何在初始化前注册转换器?
在提供的代码段中,您尝试在每次调用 toUserEntity()
时注册转换器。因此,第一次调用会成功,但第二次调用会失败,因为 MapperFacade
在第一次调用期间已经初始化。
您可以像这样将转换器注册从映射方法移动到静态块:
private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
static {
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class));
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalTime.class));
}
此外,您可能更愿意将 BoundMapperFacade
移动到静态字段以避免不必要的 getMapperFacade
调用,如下所示:
private static BoundMapperFacade<ClientDTO, ClientEntity> clientBoundMapper
= mapperFactory.getMapperFacade(ClientDTO.class, ClientEntity.class);
private static BoundMapperFacade<UserDTO, UserEntity> userBoundMapper
= mapperFactory.getMapperFacade(UserDTO.class, UserEntity.class);
所以映射方法将变成简单的一行:
public static ClientEntity toClientEntity(ClientDTO clientDTO) {
return clientBoundMapper.map(clientDTO);
}
public static UserEntity toUserEntity(UserDTO userDTO) {
return userBoundMapper.map(userDTO);
}
我在 spring 引导应用程序中使用 Orika Mapper API 创建了一个 class 来复制 bean 属性,如下所示:
public class ObjectMapper {
private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
public static ClientEntity toClientEntity(ClientDTO clientDTO) {
BoundMapperFacade<ClientDTO, ClientEntity> boundMapper = mapperFactory.getMapperFacade(ClientDTO.class, ClientEntity.class);
return boundMapper.map(clientDTO);
}
public static UserEntity toUserEntity(UserDTO userDTO) {
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class));
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalTime.class));
BoundMapperFacade<UserDTO, UserEntity> boundMapper = mapperFactory.getMapperFacade(UserDTO.class, UserEntity.class);
return boundMapper.map(userDTO);
}
}
UserEntity 和 UserDTO POJO classes 具有 JAVA 8 个 LocalDate 和 LocalTime 属性,因此为 mapperFactory 注册了转换器。这第一次工作正常,但在连续调用时会抛出以下异常:
java.lang.IllegalStateException: Cannot register converters after MapperFacade has been initialized
at ma.glasnost.orika.converter.DefaultConverterFactory.registerConverter(DefaultConverterFactory.java:192) ~[orika-core-1.4.6.jar:na]
at ma.glasnost.orika.impl.DefaultMapperFactory$ConverterFactoryFacade.registerConverter(DefaultMapperFactory.java:1614) ~[orika-core-1.4.6.jar:na]
我理解这是因为转换器在 MapperFacade 初始化后被注册。如何解决这个问题?如何在初始化前注册转换器?
在提供的代码段中,您尝试在每次调用 toUserEntity()
时注册转换器。因此,第一次调用会成功,但第二次调用会失败,因为 MapperFacade
在第一次调用期间已经初始化。
您可以像这样将转换器注册从映射方法移动到静态块:
private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
static {
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalDate.class));
mapperFactory.getConverterFactory().registerConverter(new PassThroughConverter(LocalTime.class));
}
此外,您可能更愿意将 BoundMapperFacade
移动到静态字段以避免不必要的 getMapperFacade
调用,如下所示:
private static BoundMapperFacade<ClientDTO, ClientEntity> clientBoundMapper
= mapperFactory.getMapperFacade(ClientDTO.class, ClientEntity.class);
private static BoundMapperFacade<UserDTO, UserEntity> userBoundMapper
= mapperFactory.getMapperFacade(UserDTO.class, UserEntity.class);
所以映射方法将变成简单的一行:
public static ClientEntity toClientEntity(ClientDTO clientDTO) {
return clientBoundMapper.map(clientDTO);
}
public static UserEntity toUserEntity(UserDTO userDTO) {
return userBoundMapper.map(userDTO);
}