Ошибка десериализации привязки JAX-RS JSON при использовании нескольких параметров в POST

#json #post #jax-rs #backend #json-deserialization

#json #Публикация #jax-rs #серверная часть #json-десериализация

Вопрос:

Я пытаюсь разработать почтовый ресурс Jax-RS, о котором сообщается здесь ниже:

 @Path("testJson")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response testJson(Float firstValue, Float secondValue, String thirdValue) {

    LOG.info(" firstValue: "   firstValue);
    LOG.info(" secondValue: "   secondValue);
    LOG.info(" thirdValue: "   thirdValue);

    return Response.ok().build();
}
  

Однако я получаю следующую ошибку:

  RESTEASY002305: Failed executing POST /aliments/testJson: org.jboss.resteasy.spi.ReaderException: javax.ws.rs.ProcessingException: RESTEASY008200: JSON Binding deserialization error
  

Поискав вокруг, я понял, что для метода POST, который принимает JSON, вам нужно предоставить ему только один параметр, который фактически является всем JSON-сообщением.

Мои вопросы:

  1. Почему я не могу указать два или более параметров? Это потому, что Json представляет основную часть сообщения, и у меня может быть только одно тело? Не могли бы вы объяснить мне это лучше, пожалуйста?
  2. Я могу создать DTO, содержащий мои параметры, и использовать этот DTO в качестве единственного параметра для моего метода POST, но является ли это лучшей практикой? При этом у меня будет DTO для каждого метода POST, который фактически действует как оболочка.
  3. Есть ли что-то, чего мне не хватает?

Большое спасибо за ваше время, хорошего дня.

Ответ №1:

Почему я не могу указать два или более параметров? Это потому, что Json представляет основную часть сообщения, и у меня может быть только одно тело? Не могли бы вы объяснить мне это лучше, пожалуйста?

JAX-RS допускает один параметр «сущности». Этот параметр представляет весь объект запроса. Он определяется как параметр сущности, поскольку не имеет никаких аннотаций 1. Если вам нужна необработанная сущность, вы можете использовать InputStream параметр. Если вам нужен POJO, вы можете это сделать. Преобразование выполняется с использованием MessageBodyReader s . Считыватель будет выбран на основе заголовка Content-Type и типа параметра. Фреймворк поставляется с некоторыми стандартными считывателями для легко конвертируемых типов. Например, строка, входной поток, байт[]. Считывателю будет передан поток объектов, и ему необходимо будет преобразовать поток в тип параметра. Вы можете прочитать больше о «поставщиках сущностей» здесь .

Если вы хотите использовать общий тип носителя, такой как JSON, существуют библиотеки, которые обрабатывают преобразование JSON / POJO, и из этой библиотеки можно создать reader. Для JSON обычным librabry является Jackson, и существует Jackson MessageBodyReader, предоставляемый командой Jackson.

Я могу создать DTO, содержащий мои параметры, и использовать этот DTO в качестве единственного параметра для моего метода POST, но является ли это лучшей практикой? При этом у меня будет DTO для каждого метода POST, который фактически действует как оболочка.

Да, это очень распространенная практика. Привыкайте к этому с такими фреймворками.

Есть ли что-то, чего мне не хватает?

Я не знаю, ты мне скажи.


1. Разрешены некоторые специальные аннотации, например @Valid , для проверки bean.