如何在 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) {}

其中limitapplication.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());
    }
}