9

我是 Spring Boot 和MapStruct工具的新手。

早些时候,一个项目(由其他团队使用这些技术编写)没有启动。然后,我在 Mapper 抽象类中做了一些更改,但现在映射器对象在应用程序启动时变为 null。

映射器抽象类:

@Mapper(componentModel = "spring")
public abstract class UserAndEmployeeMapper {

    public UserAndEmployeeMapper INSTANCE = Mappers.getMapper( UserAndEmployeeMapper.class );

    @Mapping(source = "username", target = "name")
    @Mapping(source = "ssn", target = "ssn", defaultValue = "xxxxxx" )
    @Mapping(target = "salary", constant = "34.67")
    @Mapping(target = "dob", dateFormat = "dd/MM/yyyy", constant = "10/12/2002")
    public abstract Employee mapToEmployee(User user);

    public abstract List<Employee> mapToEmployee(List<User> users);

    @Mapping(source = "name", target = "username")
    public abstract User mapToUser(Employee employee);

    public abstract List<User> mapToUser(List<Employee> employees);

}

LoginServiceImpl 类

@Service("loginService")
public class LoginServiceImpl implements LoginService{

    private static final AtomicLong counter = new AtomicLong();

    @Autowired
    private EmployeeDao employeeDao;

    private UserAndEmployeeMapper userAndEmployeeMapper;
...

}

pom.xml

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.jdk8.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
</build>

在 LoginServiceImpl 中添加 @Autowired 后,应用程序未启动并显示以下错误日志

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

Description:

Field userAndEmployeeMapper in org.service.impl.LoginServiceImpl required a bean of type 'org.mapper.UserAndEmployeeMapper' that could not be found.


Action:

Consider defining a bean of type 'org.mapper.UserAndEmployeeMapper' in your configuration.

有什么建议么 ?

4

7 回答 7

6

首先,public UserAndEmployeeMapper INSTANCE = Mappers.getMapper( UserAndEmployeeMapper.class );应该只与默认组件模型一起使用,否则您可能会面临UserAndEmployeeMapper未正确初始化的风险。

UserAndEmployeeMapper你里面的LoginServiceImpl必须用 注释@Autowired,否则Spring不能注入,这就是它的原因null

我不知道你的包结构。如果您的 Spring Boot 应用程序类在包中,org那么它将拾取UserAndEmployeeMapperImpl. 否则,请确保弹簧配置拾取UserAndEmployeeMapperImpl.

如果上面的所有内容都已正确设置并且您正在通过 IDE 启动应用程序,请确保target/generated-sourcesGradle 或 Gradle 的替代方案是您的源代码的一部分并且已被拾取。查看IDE 支持以确保您已正确设置 IDE 的注释处理器发现。例如,IntelliJ 不会使用您当前的设置调用 MapStruct 注释处理器,它不会annotationProcessorPaths从 maven 编译器中获取。

于 2017-06-09T18:30:18.537 回答
3

将抽象类作为接口对我有用。

public interface UserAndEmployeeMapper {
于 2017-06-19T12:06:35.077 回答
2

springfox-swagger2 依赖项在排除它并在 pom.xml 中添加特定版本的 mapstruct 依赖项后加载旧版本的 mapstruct 它开始生成源

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
<exclusions>
 <exclusion>
 <groupId>org.mapstruct</groupId>
  <artifactId>mapstruct</artifactId>
 </exclusion>
</exclusions>

在地图结构依赖项下方添加

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Beta1</version>

于 2018-08-30T13:44:29.517 回答
2

为了使所有映射器类都符合 Spring bean 的要求,请将以下 compilerArgs 添加到您的 maven-compiler-plugin。

<compilerArgs>
<arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArgs> 

如果使用 maven-processor-plugin 添加以下选项

<options>                       
<mapstruct.suppressGeneratorTimestamp>
true
</mapstruct.suppressGeneratorTimestamp>                      
<mapstruct.defaultComponentModel>
spring
</mapstruct.defaultComponentModel>
</options>
于 2018-09-23T12:29:53.993 回答
0

就我而言,我认为错误是由于 build.gradle 不完整造成的。

dependencies {
    compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.2.0.Final'
}

apply plugin: 'net.ltgt.apt'

dependencies {
    compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.2.0.Final'
    compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: '1.2.0.Final'
    apt 'org.mapstruct:mapstruct-processor:1.2.0.Final'
}


buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("net.ltgt.gradle:gradle-apt-plugin:0.9")
    }
}

确保您已正确配置 build.gradle,如文档中所述。

于 2018-09-30T13:51:23.727 回答
0

首先很简单,您需要创建如下界面,

@Mapper(componentModel = "spring")
public interface CompanyMapper {
     @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
     void updateCustomerFromDto(CompanyDto dto, @MappingTarget CompanyBean entity);
}

现在,当您运行应用程序时,它将在 target/generated-source 文件夹中自行生成其实现文件

所以每当你想使用 CompanyMapper 时,你只需要像我们使用的那样自动装配它,@Mapper(componentModel = "spring")这样 spring boot 就可以注入它。

您还需要通过 eclipse 中的以下步骤启用 Maven 注释处理:

Step1 :- 右键单击​​项目
Step2 :- 转到 Properties
Step3 : 从侧边栏展开 Maven
Step4 :- 选择 Annotation Processing
Step5 :- 选中 Enable Project Specific settings
Step6 :- 选择 Experemental Radio 按钮
Step7 :- 应用并关闭

完成 !我希望它对某人有帮助。

于 2022-02-14T14:46:52.390 回答
0

如果使用 Eclipse,您可能需要安装m2e-apt插件。

它将在 IDE 中为 MapStruct 启用注释处理器。

于 2021-10-25T09:59:51.830 回答