Для этого вы можете использовать технологию привязки данных JSON, например, JSON-B или Jackson.Эти библиотеки способны преобразовывать данные POJO <-> JSON.
После выбора одной из этих библиотек вы можете реализовать MessageBodyReader / MessageBodyWriter JAX-RS, чтобы JAX-RS указывал использоватьэти библиотеки, как конвертировать входящие / исходящие объекты.Пример реализации с использованием JSON-B может выглядеть следующим образом:
@Provider
@Produces({ "*/*" })
@Consumes({ "*/*" })
public class JsonBProvider implements MessageBodyWriter<Object>, MessageBodyReader<Object> {
private static final Jsonb jsonb = JsonbBuilder.create();
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public Object readFrom(Class<Object> clazz, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
String stringResult = convertStreamToString(entityStream);
return jsonb.fromJson(stringResult, genericType);
}
@SuppressWarnings("resource")
private static String convertStreamToString(java.io.InputStream is) {
try (Scanner s = new Scanner(is).useDelimiter("\\A")) {
return s.hasNext() ? s.next() : "";
}
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public void writeTo(Object obj, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
String strData = jsonb.toJson(obj);
jsonb.toJson(obj, entityStream);
}
}
Обратите внимание, что если вы используете сервер приложений, этот вид интеграции будет предоставлен автоматически.Кроме того, для Джексона есть отдельные библиотеки, которые делают то же самое, поэтому вам не нужно писать это самостоятельно.
Как только вы зарегистрируете MessageBodyReader / Writer, вы можете просто отправлять и получать POJOобъекты из вашего ресурса JAX-RS, например:
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
Response addNewWallet(Wallet toCreate) {
// add a wallet...
}
В приведенном выше примере, когда конечная точка JAX-RS получает данные JSON в качестве тела сообщения, она будет использовать MessageBodyReader / Writer для автоматического преобразования входящихДанные JSON в Wallet
pojo, которые будут переданы в метод addNewWallet
.