WedX - журнал о программировании и компьютерных науках

Общий абстрактный контроллер Spring и сопоставление методов GET/DELETE интерфейса

Весенняя загрузка 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)

Этот пример GitHub

16.05.2020

  • Вы не показали достаточно своего тела контроллера, чтобы сказать. (И обратите внимание, что в реальном коде Spring Data может автоматически обрабатывать две трети этого.) 16.05.2020
  • @chrylis-onstrike- Спасибо за рассмотрение проблемы. Что касается вашего предложения о Spring Data, я знаю об этом. Я намеренно опускаю его в данном случае, чтобы упростить понимание моего вопроса. Тело контроллера находится в классе AController. 16.05.2020

Ответы:


1

Я провел дополнительное исследование, отладил Spring и обнаружил, что в этом конкретном случае bean-компонент RequestMappingHandlerMapping не разрешает методы, которые не имеют в сигнатуре чистого универсального возвращаемого типа. Не могу точно сказать, является ли это ошибкой/функцией отражения или логикой обработчика Spring. Тем не менее, я открыл проблему в репозитории Spring.

17.05.2020
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]