【问题标题】:MapStruct - Cannot find implementation with IntelliJMapStruct - 找不到 IntelliJ 的实现
【发布时间】:2021-03-06 21:55:07
【问题描述】:

使用最新的 Springboot MapStruct 1.3.1 版本将 Dtos 转换为对象。 (Java 11、Gradle 6.6 版本) 我收到以下异常:

org.springframework.beans.factory.UnsatisfiedDependencyException:
   Error creating bean with name 'userController' defined in 
   file [/directory/UserController.class]: Unsatisfied dependency expressed 
   through constructor parameter 0; nested exception is 
org.springframework.beans.factory.BeanCreationException:
   Error creating bean with name 'userServiceImpl' defined in 
   file [/directory/UserServiceImpl.class]: Bean instantiation via constructor failed; 
   nested exception is 
org.springframework.beans.BeanInstantiationException: 
  Failed to instantiate [package.service.UserServiceImpl]: 
  Constructor threw exception; 
  nested exception is 
java.lang.RuntimeException: java.lang.ClassNotFoundException: 
  Cannot find implementation for package.service.mapper.UserMapper

请你看看我哪里出错了?

我的代码:

build.gradle

    compile group: 'org.mapstruct', name: 'mapstruct', version: '1.3.1.Final'

UserController.java

@CrossOrigin(origins = "*", maxAge = 3306)
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {
    private final UserServiceImpl userService;

    @PostMapping
    public ResponseEntity<UserDTO> login(UserDTO request) {
            return ResponseEntity.ok(userService.login(request));
    }

用户服务.java

public interface UserService {
    public UserDTO login(UserDTO user);
}

UserServiceImpl.java

@Service
@RequiredArgsConstructor
public class UserServiceImpl extends CheckException implements UserService {
    private final UserRepository userRepository;
    private UserMapper mapper = Mappers.getMapper(UserMapper.class);

    @Override
    public UserDTO login(UserDTO user) {
        usernameParameterCheck(user.getId());
        User currentUser = userRepository.findUserByIdAndPassword(user.getId(), user.getPassword());
        userNullCheck(currentUser);
        return mapper.entityToDto(currentUser);
    }
}

UserMapper.java

@Mapper(componentModel = "spring")
public interface UserMapper {
    User dtoToEntity(UserDTO userDTO);
    UserDTO entityToDto(User user);
}


【问题讨论】:

  • 您还需要为 MapStruct 配置处理,仅添加依赖项是不够的。此外,您应该注入映射器而不是手动获取它。不相关但会成为问题,您的控制器应引用UserService(接口)而不是实际实现UserServiceImpl
  • 谢谢!我添加了依赖项“MapStruct-processor”并编辑了引用。我应该如何手动注入映射器?

标签: java spring-boot gradle mapstruct mapper


【解决方案1】:

我解决了这个问题:在 DTO 类中添加“@NoArgsConstructor”注释:D

【讨论】:

  • 这不是一个合适的解决方案。您应该升级到最新版本的 MapStruct(目前为 1.4.1.Final)并使用构造函数映射功能。
  • 我公司使用的是 1.3.1 最终版。所以我必须在那个版本上工作。当公司升级到最新版本时,我会关注你的评论谢谢!
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 2021-04-15
  • 2020-02-07
  • 2020-08-14
  • 2021-10-19
  • 2020-01-29
相关资源
最近更新 更多