Возврат 201 Созданный статус с определенным телом в Spring Webflux - PullRequest
0 голосов
/ 04 июля 2019

Я определил следующую конечную точку REST в моем контроллере:

@PostMapping(value = "/data",
        consumes = { "application/json" },
        produces = { "application/json" })
@ResponseBody
public Mono<ServerResponse> create(
        final @ApiParam(value = "data", required = true) @Valid @RequestBody Data data) {

    Data saved = dataDAO.save(app);
    return saved != null
            ? ServerResponse.created(UriComponentsBuilder.fromPath("data/" + saved.getId()).build().toUri()).
                    contentType(MediaType.APPLICATION_JSON).
                    body(BodyInserters.fromObject(saved))
            : Mono.error(new CustomException("Error"));
}

, но когда я звоню /data, я получаю Error: Not Acceptable:

{
  "timestamp": 1562229060618,
  "path": "/data",
  "status": 406,
  "error": "Not Acceptable",
  "message": "Could not find acceptable representation"
}

, так что я думаю, что тампроблема в определении моей конечной точки, потому что в конце данные правильно создаются в моей БД.

Что я делаю не так?И как правильно вернуть статус 201 Создано с телом, которое я хочу (Data тип)?

Связана ли эта ошибка с тем, что она не распознает действительные данные для возврата?

Спасибо

1 Ответ

0 голосов
/ 07 июля 2019

Относительно вашего первого вопроса, я понятия не имею, потому что вы не опубликовали, как выглядит ваш запрос или как выглядит ваш Data объект, так что это может быть что угодно. Трудно решить, когда у вас нет всей картины.

Но я собираюсь ответить на ваш второй вопрос:

Как правильно вернуть статус 201 Создан с телом, которое я хочу (Тип данных)?

Data saved = dataDAO.save(app);

Это выше, блокирующий вызов. Он будет вызывать вашу базу данных и ждать, пока не получит ваш Data объект обратно.

Поскольку я понятия не имею, какую базу данных вы используете, но этот вызов должен быть заключен в Mono.fromCallable, чтобы этот блокирующий вызов получал свой собственный поток из пула потоков elastic согласно реактивной документации блокировка вызова

return Mono.fromCallable(() -> {
    return dataDAO.save(app);
}).subscribeOn(Schedulers.elastic())
  .flatMap(data -> {
      return ServerResponse.ok().syncBody(data);
});

Я понятия не имею, что в вашем дао, поэтому я не буду писать никакой обработки ошибок, но я бы возвратил необязательный, а не null из него, намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...