Quarkus Mapstruct 的 UnsatisfiedResolutionException

问题描述 投票:0回答:3

我正在尝试在我的 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;

}
    
...
dependency-injection quarkus mapstruct
3个回答
2
投票

对于最后一个 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;
   ...
}

0
投票

问题是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>

0
投票

2024年,我遇到了同样的问题。以上所有内容在任何映射结构版本中都没有帮助,无论有或没有@Inject。此外,使用

Mappers
工厂生成了空指针。看来,您当前(即 1.6.0.RC1,没有测试旧版本)必须使用
@Mapper(componentModel = "jakarta-cdi")
,然后在客户端代码中使用
@Inject
。哦亲爱的。所有这些处理器插件和依赖项都会使用户界面变得相当混乱,特别是如果大多数示例不使用@Inject。原始文档将其隐藏在 maven 参数列表中,查找
mapstruct.defaultComponentModel

© www.soinside.com 2019 - 2024. All rights reserved.