Весенняя загрузка 2.2.7. Давайте представим следующую структуру проекта:
Общий интерфейс репозитория:
public interface IRepository<T> {
Optional<T> get(Long id);
List<T> getALl();
T save(T t);
}
… его реализация:
@Component
public class IntegerRepository implements IRepository<Integer> {
@Override
public Optional<Integer> get(Long id) {
return Optional.of(10);
}
@Override
public List<Integer> getALl() {
return Arrays.asList(10,20,30);
}
@Override
public Integer save(Integer integer) {
return integer;
}
}
Общий абстрактный класс контроллера:
public abstract class AController<T> {
private IRepository<T> repository;
public AController(IRepository<T> repository) {
this.repository = repository;
}
public Optional<T> get(Long id) {
return repository.get(id);
}
public List<T> getAll() {
return repository.getALl();
}
public T post(T t) {
return repository.save(t);
}
}
Интерфейс контроллера:
@RequestMapping("/integers")
public interface IntegerController {
@RequestMapping(method = RequestMethod.GET, value = "/{id}")
Optional<Integer> get(@PathVariable Long id);
@RequestMapping(method = RequestMethod.GET)
List<Integer> getAll();
@RequestMapping(method = RequestMethod.POST)
Integer post(@RequestBody Integer t);
}
…и его реализация:
@RestController
public class IntegerControllerImpl extends AController<Integer> implements IntegerController {
@Autowired
public IntegerControllerImpl(IntegerRepository repository) {
super(repository);
}
}
Почему Spring не отображает методы get()
и getAll()
контроллера, а post()
делает?
2020-05-16 09:44:51.347 TRACE 5437 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : c.a.s.c.IntegerControllerImpl: {POST /integers}: post(Integer)
УПД. Я провел некоторое исследование и обнаружил, что если подкласс контроллера переопределяет методы GET/DELETE (PUT и POST работают хорошо), он будет работать так, как ожидалось. Таким образом, кажется, что эти HTTP-методы не поддерживаются для наследования такого поведения от суперкласса из-за дженериков... Однако, возможно, позже я открою проблему с этим случаем в весеннем репозитории MVC GitHub.
@RestController
public class IntegerControllerImpl extends AController<Integer> implements IntegerController {
@Autowired
public IntegerControllerImpl(IntegerRepository repository) {
super(repository);
}
@Override
public Optional<Integer> get(Long id) {
return super.get(id);
}
@Override
public List<Integer> getAll() {
return super.getAll();
}
}
Вывод журнала
2020-05-16 13:54:12.843 TRACE 5914 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping :
c.a.s.c.IntegerControllerImpl:
{GET /integers/{id}}: get(Long)
{GET /integers}: getAll()
{POST /integers}: post(Integer)