public StatusManager() {
this.client = ClientBuilder.newClient();
}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Примеры rsvp
и customer
используют клиентский API для вызова сервисов JAX-RS. В этом разделе описывается, как каждый пример приложения использует клиентский API.
Здесь рассматриваются следующие темы:
Приложение 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;
}
Приложение 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>>
.
Назад | Вперёд | Содержание |