MongoDB и Spring MVC: операция PATCH? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующий простой Java Контроллер с каркасом Spring Web:

@RestController
@RequestMapping("/rounds")
@Slf4j
public class RoundController {

    private RoundService roundService;

    @Autowired
    public RoundController(RoundService roundService) {
        this.roundService = roundService;
    }

    @GetMapping(
        produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.OK)
    public List<Round> find() {

        return roundService.find();
    }

    @GetMapping(
        path = "/{userId}",
        produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.OK)
    public List<Round> get(@PathVariable String userId) {

        return roundService.getRoundsByUserId(userId);
    }

    @PostMapping(
        produces = MediaType.APPLICATION_JSON_VALUE
    )
    @ResponseStatus(HttpStatus.CREATED)
    public Round create(@Valid @NotNull @RequestBody Round round) {

        roundService.create(round);

        return round;
    }

    @DeleteMapping(
        path = "/{id}",
        produces = MediaType.APPLICATION_JSON_VALUE
    )
    @ResponseStatus(HttpStatus.OK)
    public void delete(@PathVariable String id) {

        ObjectId objectId = new ObjectId(id);

        roundService.delete(objectId);
    }
}

При использовании Mongo есть ли лучшая практика для обновления / исправления для объекта?

Лучше всего просто использовать метод POST и повторно сохранить объект Round в БД с изменениями, внесенными пользователем?

1 Ответ

1 голос
/ 05 февраля 2020

По моему мнению, лучшей практикой не должно быть использование POST для выполнения обновления / патча.

Сохраняйте POST только для создания раундов.

Если вы используете spring data mongodb просто вызовите метод сохранения вашего репозитория с вашей сущностью, см. https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/MongoRepository.html

Для обновления лучше добавить PUT / {roundId} в ваш контроллер и либо:

  • вызовите метод сохранения, если у вас есть все данные раунда
  • вызовите findById, чтобы получить полные данные и задать данные, которые вы хотите изменить, затем сохранить (но это больше похоже на PATCH )

Или вы также можете добавить PATCH / {roundId} и обновить только поле, которое вы хотите в своем документе, см. https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html

...