我正在尝试在我的 Quarkus 项目中使用 Mapstruct,但是当我使用
/.mvnw compile quarkus:dev
运行应用程序时
我遇到以下异常:
javax.enterprise.inject.UnsatisfiedResolutionException:类型的依赖性不满足 org.acme.dto.mapper.BookMapper 和限定符 [@Default]
(我检查了
target/generated-sources
中生成的类,它们得到了@ApplicationScoped
)
详情:
Mapstruct 依赖项添加到 pom.xml 中:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
我有几个地图绘制者,例如:
@Mapper(componentModel = "cdi", uses = { BookDetailsMapper.class, AuthorMapper.class })
public interface BookMapper {
BookDto toDto(Book book);
Book toEntity(BookDto bookDto);
}
@Mapper(componentModel = "cdi")
public interface AuthorMapper {
AuthorDto toDto(Author author);
Author toEntity(AuthorDto author);
}
@Mapper(componentModel = "cdi")
public interface BookDetailsMapper {
BookDetailsDto toDto(BookDetails bookDetails);
BookDetails toEntity(BookDetailsDto bookDetailsDto);
}
BookMapper bean 被注入:
@ApplicationScoped
public class BookService {
private final BookMapper bookMapper;
@Inject
public BookService(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
...
对于最后一个 jakarta 包,您需要使用以下方式注释映射器接口:
@Mapper(componentModel = "jakarta")
public interface SomeMapper {
...
}
就我而言,我也使用lombok:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${dependency.version.lombok}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${dependency.version.lombok-mapstruct-binding}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${dependency.version.mapstruct}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
使用方法:
@ApplicationScoped
@RequiredArgsConstructor
public class MyClass {
private final SomeMapper someMapper;
...
}
问题是mapstruct的生成源没有编译成类文件。
我必须添加
mapstruct-processor
依赖项,如下所示:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-extension-processor</artifactId>
<version>${quarkus.platform.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
2024年,我遇到了同样的问题。以上所有内容在任何映射结构版本中都没有帮助,无论有或没有@Inject。此外,使用
Mappers
工厂生成了空指针。看来,您当前(即 1.6.0.RC1,没有测试旧版本)必须使用 @Mapper(componentModel = "jakarta-cdi")
,然后在客户端代码中使用 @Inject
。哦亲爱的。所有这些处理器插件和依赖项都会使用户界面变得相当混乱,特别是如果大多数示例不使用@Inject。原始文档将其隐藏在 maven 参数列表中,查找 mapstruct.defaultComponentModel