Как создать конечную точку, где данные передаются в теле запроса, используя javax.ws.rs? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть следующий метод в интерфейсе моего сервиса

@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
Response addNewWallet();

Но этот метод post не использует body для публикации json в Web-сервисе, новый кошелек просто генерирует на слое DAO, а затем преобразует в json.

Как я могу создать новый кошелек, используя, например, Postman для отправки этого кошелька (как json) в теле сообщения?

Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

Для этого вы можете использовать технологию привязки данных 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.

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