У меня есть следующий репозиторий REST, реализация которого создается во время выполнения Spring.
@RepositoryRestResource
public interface FooRepository extends CrudRepository<Foo, Long> {
}
Это означает, что у меня будут функции save(), find(), exists() и другие доступные методы и доступные через REST.
Теперь я хотел бы переопределить один из методов; например, save(). Для этого я бы создал контроллер, демонстрирующий этот метод, например:
@RepositoryRestController
@RequestMapping("/foo")
public class FooController {
@Autowired
FooService fooService;
@RequestMapping(value = "/{fooId}", method = RequestMethod.PUT)
public void updateFoo(@PathVariable Long fooId) {
fooService.updateProperly(fooId);
}
}
Проблема: Если я включу этот контроллер, то все другие методы, реализованные с помощью Spring, больше не отображаются. Так, например, я больше не могу делать запрос GET в /foo/ 1
Вопрос: Есть ли способ переопределить методы REST, сохраняя при этом другие автоматически сгенерированные методы Spring?
Дополнительная информация:
-
Этот вопрос кажется очень похожим: Spring Data Rest: переопределить метод в RestController с таким же способом-сопоставлением маршрутов... но я не хочу менять путь к чему-то вроде foo/1/сохранить
-
Я думал об использовании @RepositoryEventHandler, но я не очень люблю эту идею, потому что я хотел бы инкапсулировать ее под службу. Кроме того, вы, похоже, теряете контроль над контекстом транзакции.
-
В этой части документа Spring Документация говорится следующее:
Иногда вам может понадобиться написать специальный обработчик для определенного ресурс. Чтобы воспользоваться параметрами Spring Data RESTs, сообщение преобразователей, обработки исключений и т.д., используйте @RepositoryRestController аннотации вместо стандартного Spring MVC @Controller или @RestController
поэтому кажется, что он должен работать из коробки, но, к сожалению, нет.