当前位置: 首页 > 知识库问答 >
问题:

无法自动绘制MapStruct映射程序

濮阳茂材
2023-03-14

我在遵循这个关于部分更新的教程。按照指示,我创建了带有适当注释的映射器接口。

这是映射器

@Mapper(componentModel = "spring")
public interface UserEntityMapper {
  
  @Mapping(source = "password", target = "password")
  @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
  void updatePasswordFromDTO(PasswordResetRequest dto, @MappingTarget User entity);
}

根据本教程,@mapper(componentModel=“Spring”)将映射器生成为一个Spring bean,可以通过@autowired检索。

@Service
@Transactional
public class AccountServiceImpl implements IAccountService {
  ...
  @Autowired
  private UserEntityMapper userMapper;
  ...
}

我得到这个错误,我的应用程序启动失败。

***************************
APPLICATION FAILED TO START
***************************

Description:

Field userMapper in com.application.services.AccountServiceImpl required a bean of type 'com.application.mappers.UserEntityMapper' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.application.mappers.UserEntityMapper' in your configuration.

最后,这里是我的项目的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.myproject</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>authentication-template</name>
    <description>Description</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-freemarker -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我也尝试了这些不同的解决方案,但结果相同。

  1. 由@som回答
  2. 由@gunnar回答
@SpringBootApplication
@PropertySources(value = {
  @PropertySource("classpath:mail.properties"),
  @PropertySource("classpath:messages.properties"),
  @PropertySource("classpath:security.properties")
})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

请帮忙,谢谢:)

共有1个答案

南宫凡
2023-03-14

有几个建议你可以调查。首先,检查MVN生成的类中是否有@Component。

  • 如果是,请检查应用程序是否配置为扫描该包。
  • 如果没有,请尝试阅读MapStruct文档。
 类似资料:
  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我正在使用MapStruct和在我的代码中的不同业务用例之间共享的大模型(超过50个字段)。根据入口点的不同,有些属性将被映射,有些则不被映射。当我构建我的项目时,我总是会得到“警告:未映射的目标属性”消息。 我已经研究过,并且看到可以通过使用语义命令来告诉mapstruct忽略该字段 问题是,给定我的对象具有如此多的字段,忽略每个映射器类中的每个属性将需要大量的代码。我也不想在我的日志上出现这个

  • 问题内容: 我正在使用MapStruct库映射对象,但出现此错误: 无法将属性“ java.util.Date aDate”映射到“ javax.xml.bind.JAXBElement ADATE”。考虑声明/实现一个映射方法:“ javax.xml.bind.JAXBElement map(java.util.Date value)”。 我的问题:应该在哪里取消此映射方法? 问题答案: 我通过

  • 目标对象 我希望每个都是的映射,带有,mapstruct生成如下所示: 但相反,我得到了一个编译错误: 源参数中不存在名为“Roleids”的属性。你是说“空”吗?

  • 我喜欢使用mapstruct,但我找不到:是否有一个函数将Pagable中的排序转换为映射的dto可分页到实体可分页? 链接: 可分页:https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html 排序:https://docs.spring.io/

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->