Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Использование клиентского API в примерах приложений JAX-RS

Примеры rsvp и customer используют клиентский API для вызова сервисов JAX-RS. В этом разделе описывается, как каждый пример приложения использует клиентский API.

Здесь рассматриваются следующие темы:

Клиентский API в примере rsvp

Приложение rsvp позволяет пользователям отвечать на приглашения на мероприятия, используя ресурсы JAX-RS, как описано в Приложение rsvp. Веб-приложение использует клиентский API во вспомогательных компонентах CDI для взаимодействия с ресурсами сервиса, а веб-интерфейс Facelets отображает результаты.

Вспомогательный бин CDI StatusManager извлекает все текущие мероприятия в системе. Объект клиента, используемый во вспомогательном компоненте, создаётся в конструкторе:

public StatusManager() {
    this.client = ClientBuilder.newClient();
}

Метод StatusManager.getEvents возвращает коллекцию всех текущих мероприятий в системе, вызывая ресурс по ссылке http://localhost:8080/rsvp/webapi/status/all , который возвращает документ XML с записями для каждого мероприятия. Клиентский API автоматически демаршализирует XML и создаёт объект List<Event>.

    public List<Event> getEvents() {
        List<Event> returnedEvents = null;
        try {
            returnedEvents = client.target(baseUri)
                    .path("all")
                    .request(MediaType.APPLICATION_XML)
                    .get(new GenericType<List<Event>>() {
            });
            if (returnedEvents == null) {
                logger.log(Level.SEVERE, "Returned events null.");
            } else {
                logger.log(Level.INFO, "Events have been returned.");
            }
        } catch (WebApplicationException ex) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }
        ...
        return returnedEvents;
    }

Метод StatusManager.changeStatus используется для изменения ответа участника. Он создаёт HTTP-запрос POST к сервису с новым ответом. Тело запроса является XML-документом.

    public String changeStatus(ResponseEnum userResponse,
            Person person, Event event) {
        String navigation;
        try {
            logger.log(Level.INFO,
                    "changing status to {0} for {1} {2} for event ID {3}.",
                    new Object[]{userResponse,
                        person.getFirstName(),
                        person.getLastName(),
                        event.getId().toString()});
             client.target(baseUri)
                     .path(event.getId().toString())
                     .path(person.getId().toString())
                     .request(MediaType.APPLICATION_XML)
                     .post(Entity.xml(userResponse.getLabel()));
            navigation = "changedStatus";
        } catch (ResponseProcessingException ex) {
            logger.log(Level.WARNING, "couldn''t change status for {0} {1}",
                    new Object[]{person.getFirstName(),
                        person.getLastName()});
            logger.log(Level.WARNING, ex.getMessage());
            navigation = "error";
        }
        return navigation;
    }

Клиентский API в примере customer

Приложение customer сохраняет данные клиента в базе данных и предоставляет ресурс в виде XML, как описано в Приложение customer. Ресурс сервиса предоставляет методы, которые создают клиентов и возвращают список всех клиентов. Веб-приложение Facelets выступает в качестве клиента для ресурса сервиса с формой для создания клиентов и отображения списка клиентов в таблице.

Сессионный компонент без состояния CustomerBean использует клиентский API JAX-RS для взаимодействия с ресурсом сервиса. Метод CustomerBean.createCustomer принимает объект сущности Customer, созданный формой Facelets, и выполняет вызов POST для URI сервиса.

public String createCustomer(Customer customer) {
    if (customer == null) {
        logger.log(Level.WARNING, "customer is null.");
        return "customerError";
    }
    String navigation;
    Response response =
            client.target("http://localhost:8080/customer/webapi/Customer")
            .request(MediaType.APPLICATION_XML)
            .post(Entity.entity(customer, MediaType.APPLICATION_XML),
                    Response.class);
    if (response.getStatus() == Status.CREATED.getStatusCode()) {
        navigation = "customerCreated";
    } else {
        logger.log(Level.WARNING,
                "couldn''t create customer with id {0}. Status returned was {1}",
                new Object[]{customer.getId(), response.getStatus()});
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null,
                new FacesMessage("Could not create customer."));
        navigation = "customerError";
    }
    return navigation;
}

Сущность XML-запроса создаётся путём вызова метода Invocation.Builder.post, передачи нового объекта Entity, содержащего объект Customer, и указания типа MIME MediaType.APPLICATION_XML.

Метод CustomerBean.retrieveCustomer извлекает объект сущности Customer из сервиса, добавляя идентификатор клиента в URI сервиса.

public String retrieveCustomer(String id) {
    String navigation;
    Customer customer =
            client.target("http://localhost:8080/customer/webapi/Customer")
            .path(id)
            .request(MediaType.APPLICATION_XML)
            .get(Customer.class);
    if (customer == null) {
        navigation = "customerError";
    } else {
        navigation = "customerRetrieved";
    }
    return navigation;
}

Метод CustomerBean.retrieveAllCustomers извлекает коллекцию клиентов в виде объекта List<Customer>. Затем этот список отображается в виде таблицы в веб-приложении Facelets.

public List<Customer> retrieveAllCustomers() {
    List<Customer> customers =
            client.target("http://localhost:8080/customer/webapi/Customer")
            .path("all")
            .request(MediaType.APPLICATION_XML)
            .get(new GenericType<List<Customer>>() {
            });
    return customers;
}

Поскольку тип ответа является коллекцией, метод Invocation.Builder.get вызывается путём передачи нового объекта GenericType<List<Customer>>.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)