Я наконец нашел способ переопределить методы Spring Data REST с помощью пользовательской реализации. К сожалению, это отключает обработку по умолчанию.
Мой репозиторий должен содержать findAll
и findById
, отображаемые над GET: /games
и GET: /games/{id}
соответственно, и save
не должен экспортироваться, поскольку он переопределяется контроллером .
@RepositoryRestResource(path = "games", exported = true)
public interface GameRepository extends Repository<Game, UUID> {
Collection<Game> findAll();
Game findById(UUID id);
@RestResource(exported = false)
Game save(Game game);
}
Мой контроллер должен обработать POST: /games
, сгенерировать игру на сервере и вернуть сохраненную игру.
@RepositoryRestController
@ExposesResourceFor(Game.class)
@RequestMapping("games")
public class CustomGameController {
private final GameService gameService;
public CustomGameController(GameService gameService) {
this.gameService = gameService;
}
@ResponseBody
@RequestMapping(value = "", method = RequestMethod.POST, produces = "application/hal+json")
public PersistentEntityResource generateNewGame(@RequestBody CreateGameDTO createGameDTO, PersistentEntityResourceAssembler assembler) {
Game game = gameService.generateNewGame(createGameDTO);
return assembler.toFullResource(game);
}
}
Однако, когда я пытаюсь GET: /games
, он возвращает 405: Method Not Allowed
но POST: /games
работает как задумано. Когда я изменяю значение отображения generateNewGame на "new"
, все три запроса работают. Но POST: /games/new
не является RESTful URL Layout, и я бы предпочел его избежать. Я не понимаю, почему у меня такое поведение и как я могу его решить. У кого-нибудь есть подсказка?