MapStruct 实现在 Spring Boot Web 应用程序中不起作用

新手上路,请多包涵

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

早些时候,一个项目(由其他团队使用这些技术编写)没有启动。然后,我在 Mapper 抽象类中做了一些更改,但现在 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.

有什么建议么 ?

原文由 Ankit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 891
2 个回答

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

 public interface UserAndEmployeeMapper {

原文由 Ankit 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

The UserAndEmployeeMapper in your LoginServiceImpl must be annotated with @Autowired , otherwise it cannot be injected by Spring, and that’s why it is null .

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

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

原文由 Filip 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题