Рассмотрите возможность определения bean-компонента типа UserConverter в вашей конфигурации. - PullRequest
0 голосов
/ 05 мая 2020

Я не знаю, что случилось с моим приложением весенней загрузки, но теперь я не могу запустить его из-за ошибки:

***************************
APPLICATION FAILED TO START
***************************
Description:
Field userConverter in webapp.controllers.UserResourceController required a bean of type 'webapp.converter.UserConverter' 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 'webapp.converter.UserConverter' in your configuration.
Process finished with exit code 1

Код контроллера:

@RestController
@RequestMapping("/api/user")
public class UserResourceController {

@Autowired
private UserServiceImpl userService;

@Autowired
private UserConverter userConverter;

@PostMapping
public ResponseEntity<UserDto> addUser(@RequestBody UserDto userDto) {
    userService.persist(userConverter.toUser(userDto));
    return ResponseEntity.ok().body(userDto);
}

@GetMapping
public ResponseEntity<List<UserDto>> findAllUsers() {
    return ResponseEntity.ok(userConverter.toUserDtos(userService.getAll()));
}

@PutMapping("/api/user/{id}")
public ResponseEntity<UserDto> updateUser(@PathVariable Long id, @RequestBody UserDto userDto) {
    User user = userConverter.toUser(userDto);
    user.setId(id);
    userService.persist(user);
    return ResponseEntity.ok().body(userDto);
}

@GetMapping("/api/user/{id}")
public ResponseEntity<UserDto> findUser (@PathVariable Long id) {
    Optional<User> user = Optional.ofNullable(userService.getByKey(id));
    return ResponseEntity.ok(userConverter.toUserDto(user.get()));
}
}

Класс сопоставителя:

@Mapper(componentModel = "spring")
@Service
public abstract class UserConverter {
    public abstract User toUser(UserDto userDto);
    public abstract UserDto toUserDto(User user);
    public abstract List<UserDto> toUserDtos(List<User> users);
}

Сначала я попытался запустить его без аннотации @Service, а затем с аннотацией, но я всегда вижу одну и ту же ошибку.

1 Ответ

0 голосов
/ 05 мая 2020

Вы не можете внедрить абстрактный класс, у которого нет реальной реализации. В Java это невозможно даже без Spring. Ожидаете ли вы, что он может быть введен?

Я не понимаю, зачем вам нужно внедрять этот класс. Лучшее решение - создать служебный класс с соответствующим конвертером, например:

public final class UserConverter {
    private UserConverter() {}

    public static UserDTO toUserDTO(User employee) {
        Department empDp = employee.getDepartment();
        return UserDTO.builder()
                .id(employee.getId())
                .name(employee.getName())
                .active(employee.getActive())
                .departmentId(empDp.getId())
                .departmentName(empDp.getName())
                .build();
    }

    public static User toUser(UserDTO dto) {
        Department dp = Department.builder()
                .id(dto.getDepartmentId())
                .name(dto.getDepartmentName())
                .build();
        return User.builder()
                .id(dto.getId())
                .name(dto.getName())
                .active(dto.getActive())
                .department(dp)
                .build();
    }
}

и вызвать его как метод stati c из вашего кода:

@GetMapping("/{id}")
public ResponseEntity<UserDto> findUser (@PathVariable Long id) {
    return userService.getByKey(id)
            .map(ResponseEntity::ok)
            .orElse(ResponseEntity.notFound().build());
}

Кроме того, ваш в коде есть некоторые ошибки для вашего API:

  • сопоставление с ресурсом должно быть множественным, например @RequestMapping("/api/users") ->, и только когда вам нужна операция по идентификатору, добавьте @GetMapping("/{id}")
  • метод create должен вернуть 201 - Create код состояния вместо 200
  • если /api должен быть общим для всех ваших API, вы можете определить его в файле конфигурации для всех ваших ресурсов.
    Фрагмент из applicatoin.yml:

    server: servlet: context-path: / api

Полезные ссылки для решений с MapStruct:

...