Ответ 1
Прежде всего вам нужно понять, как выполняется разбор тела запроса. В разборе JAX-RS (или unmarshalling/deserializing/whatever) выполняется с MessageBodyReader
s. Существуют разные читатели, которые могут обрабатывать разные типы контента. Например, если у вас есть Content-Type application/octet-stream
, есть читатель, который будет развязать код byte []
или File
или < код > InputStreamкод > . Таким образом, следующее будет работать в окне
Таким образом, реализации JAX-RS поставляются с очень базовыми читателями для "легко конвертируемого" формата. Например, большинство запросов могут быть преобразованы в String
, поэтому вы получаете это бесплатно для большинства типов контента, так же как и с вашим текущим кодом.
Если нам нужны более сложные типы данных, например ваш HelloWorld
для Content-Type application/json
, для этого нет стандартного читателя. Чтобы это сработало, нам нужно создать наш собственный читатель или использовать библиотеку, которая поставляется с читателем. К счастью, самая популярная структура JSON в Java, Jackson, внедрила поставщика JAX-RS, который имеет читатель и писатель (для сериализации).
Теперь, в зависимости от того, какую версию сервера /JAX -RS вы используете, различные реализации создают легкие обертки вокруг основного модуля Jackson JAX-RS. Если бы я знал реализацию JAX-RS, которую вы использовали, я мог бы порекомендовать, какую оболочку использовать, или вы можете забыть обертку и просто пойти с базовым модулем Джексона, который
<Предварительно > <код > < зависимость > < идентификатор_группа > com.fasterxml.jackson.jaxrs </GroupID> < артефакт > ДЖЕКСОН-jaxrs-JSON-поставщик </артефакт > < & версии GT; 2.2.3 </& версии GT; </зависимость > Код >Выше была зависимость от Maven. Если вы не используете Maven, вам в основном нужно загрузить все эти банки.
Вы можете найти все из них здесь. Просто найдите их индивидуально.
Затем вам необходимо зарегистрировать поставщика. Опять же, это зависит от вашей реализации JAX-RS и того, как вы обрабатываете конфигурацию своих классов ресурсов. Мне нужно будет увидеть вашу конфигурацию приложения (либо web.xml, либо код Java), и, возможно, сервер, который вы используете, чтобы помочь с этим. По большей части необходимо зарегистрировать JacksonJsonProvider
(который является читателем и писателем).
После того, как вы зарегистрировались, вам нужно понять основы того, как Джексон справляется с сериализацией. На уровне basic Джексон ищет свойства JavaBean ( базовый геттер/сеттер), чтобы соответствовать свойствам JSON. Например, если у вас есть это свойство Bean
открытый класс HelloWorld { private String name;
public String getName() { имя возврата; }
public void setName (имя строки) { this.name = name; }
}
Код>
JSON должен выглядеть как { "name": "whatever" }
. Клавиша "name"
совпадает с свойством Bean. В терминах свойств Bean имя свойства - это все буквы после get/set
с первой буквой в нижнем регистре.
Это почти все, что нужно. Теперь вы можете сделать
<Предварительно > <код > @Consumes ( "применение/JSON" ) публичный ответ (HelloWorld helloWorld) { String name = helloWorld.getName();//должно == "независимо" return Response.ok(helloWorld).build();//мы можем также возвращать объекты } Код >Для более сложных форматов JSON вы должны обратиться к документации Джексона или задать вопрос здесь на SO.
Что касается регистрации JacksonJsonProvider
, если у вас возникли проблемы, предоставьте запрошенную мной информацию, то есть конфигурацию приложения (web.xml или конфигурацию Java) и сервер, который вы используете.
См. также:
- JAX-RS Entity Provider, чтобы узнать подробнее о читателях и писателях