如何在 MapStruct 映射器中使用@ConfigProperty?
How to use @ConfigProperty in a MapStruct mapper?
我的 Mapper 中需要一个 @ConfigProperty。
我无法注入它,因为 Mapper 是一个接口。
我该如何解决这个问题?
@ConfigProperty(name = "limit") // <- Does not work here
int limit;
@Mapping(target = "myTarget", source = "mySource", qualifiedByName = "myLimitMapper")
MyDto toDTO(Entity entity);
@Named(value = "myLimitMapper")
default int mapLimit(int number) {
if (number >= limit) return limit;
else return number;
}
我假设您正在使用 Quarkus
,看到 @ConfigProperty
。但是您可以定义一个 abstract
映射器并使用 cdi
componentModel 让 MapStruct 创建一个 @ApplicationScoped
CDI bean。这在 MapStruct 文档的 dependency injection section 中有描述。
例如你有 2 类 映射:
public record UserModel(String name, int number) {}
public record UserDto(String name, int number) {}
其中limit
在application.properties
中配置为100
。
您的映射器将如下所示:
@Mapper(componentModel = "cdi")
public abstract class UserMapper {
@ConfigProperty(name = "limit")
int limit;
@Mapping(target = "number", source = "number", qualifiedByName = "myLimitMapper")
abstract UserDto mapToDto(UserModel userModel);
@Named(value = "myLimitMapper")
int mapLimit(int number) {
if (number >= limit) return limit;
else return number;
}
}
您可以运行将其作为@QuarkusTest
来验证:
@QuarkusTest
public class LimitTest {
@Inject
UserMapper userMapper;
@Test
public void testMapping() {
UserModel userModel = new UserModel("John", 150);
UserDto userDto = userMapper.mapToDto(userModel);
assertEquals("John", userDto.name());
assertEquals(100, userDto.number());
}
}
我的 Mapper 中需要一个 @ConfigProperty。 我无法注入它,因为 Mapper 是一个接口。
我该如何解决这个问题?
@ConfigProperty(name = "limit") // <- Does not work here
int limit;
@Mapping(target = "myTarget", source = "mySource", qualifiedByName = "myLimitMapper")
MyDto toDTO(Entity entity);
@Named(value = "myLimitMapper")
default int mapLimit(int number) {
if (number >= limit) return limit;
else return number;
}
我假设您正在使用 Quarkus
,看到 @ConfigProperty
。但是您可以定义一个 abstract
映射器并使用 cdi
componentModel 让 MapStruct 创建一个 @ApplicationScoped
CDI bean。这在 MapStruct 文档的 dependency injection section 中有描述。
例如你有 2 类 映射:
public record UserModel(String name, int number) {}
public record UserDto(String name, int number) {}
其中limit
在application.properties
中配置为100
。
您的映射器将如下所示:
@Mapper(componentModel = "cdi")
public abstract class UserMapper {
@ConfigProperty(name = "limit")
int limit;
@Mapping(target = "number", source = "number", qualifiedByName = "myLimitMapper")
abstract UserDto mapToDto(UserModel userModel);
@Named(value = "myLimitMapper")
int mapLimit(int number) {
if (number >= limit) return limit;
else return number;
}
}
您可以运行将其作为@QuarkusTest
来验证:
@QuarkusTest
public class LimitTest {
@Inject
UserMapper userMapper;
@Test
public void testMapping() {
UserModel userModel = new UserModel("John", 150);
UserDto userDto = userMapper.mapToDto(userModel);
assertEquals("John", userDto.name());
assertEquals(100, userDto.number());
}
}