Автор оригинала: Pankaj Kumar.
Добро пожаловать в учебник по Java-Джерси. Недавно я начал работать над проектом веб-сервиса Restful с использованием JAX-RS Jersey framework.
Что такое Java Jersey Framework?
Проект Java Jersey отслеживает API JAX-RS, который используется для создания веб-служб Restful на Java.
1. Кому следует использовать этот учебник?
Этот учебник предназначен для Java-программистов, которые заинтересованы в разработке и развертывании веб-сервисов Restful с использованием API JAX-RS и JAXB.
2. Предварительные условия
В рамках этого руководства предлагается использовать API Jersey для создания веб-служб Restful и вызова веб-службы с помощью клиентской программы Java и тестирования веб-службы с помощью этого инструмента.
Чтобы легко понять учебник, требуется базовое понимание Java, веб-служб, XML, Maven и любого сервера приложений (JBoss/Tomcat).
3. Программное обеспечение и инструменты
- JDK версии 1.8.0_131
- Apache Maven 3.5.3
- Mac OS X 10.13.4
- Кот 8.5.16
- Eclipse Java EE IDE Кислород 4.7.3
Создание проекта Jersey Eclipse Maven
Создайте “Динамический веб-проект” в Eclipse, а затем преобразуйте его в проект maven. Это предоставит нам базовый проект веб-приложения на основе maven.
Я дал groupId как com.journaldev.jersey
и artifactId как мой-джерси-проект
но вы можете указать все, что вам нравится. Как только мы завершим разработку нашего проекта, структура проекта будет выглядеть так, как показано на рисунке ниже.
Объяснение проекта веб-службы Java Jersey Restful
1. pom.xml : Сведения о конфигурации проекта, обратите внимание на предоставленные зависимости от джерси, другие сведения являются общими для любого аналогичного проекта maven.
4.0.0 com.journaldev.jersey my-jersey-project 0.0.1-SNAPSHOT war com.sun.jersey jersey-server 1.14 com.sun.jersey jersey-servlet 1.14 com.sun.jersey jersey-client 1.14 My-Jersey-Project maven-compiler-plugin 3.7.0 1.8 1.8 maven-war-plugin 3.0.0 WebContent
2. EmpRequest.java : Компонент Java для объекта запроса. Здесь важно отметить аннотацию @XmlRootElement
для сопоставления класса с элементом XML.
package com.journaldev.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "empRequest") public class EmpRequest { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3. EmpResponse.java : Компонент Java для объекта ответа.
package com.journaldev.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "empResponse") public class EmpResponse { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
4. ErrorResponse.java : Компонент Java, который будет отправлен в качестве ответа в случае исключения.
package com.journaldev.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "errorResponse") public class ErrorResponse { private String errorCode; private int errorId; public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } public int getErrorId() { return errorId; } public void setErrorId(int errorId) { this.errorId = errorId; } }
5. Исключение EmpNotFoundException.java : обычный класс исключений, создаваемый в веб-службе.
package com.journaldev.exception; public class EmpNotFoundException extends Exception { private static final long serialVersionUID = 4351720088030656859L; private int errorId; public int getErrorId() { return errorId; } public EmpNotFoundException(String msg, int errorId) { super(msg); this.errorId = errorId; } public EmpNotFoundException(String msg, Throwable cause) { super(msg, cause); } }
6. web.xml : Дескриптор развертывания для веб-службы. Таким образом, любой запрос с URI https://<ХОСТ>:<ПОРТ>/My-Jersey-Project/rest/*
будет обработан сервлетом Jersey ServletContainer.
Значение параметра инициализации, переданное для “com.sun.jersey.config.property.packages”, определяет, в каком пакете джерси будет искать классы веб-служб. Это свойство должно указывать на ваши классы ресурсов. Он также ищет классы ресурсов в подпакетах.
My Jersey Project Jersey REST Service com.sun.jersey.spi.container.servlet.ServletContainer com.sun.jersey.config.property.packages com.journaldev 1 Jersey REST Service /rest/*
7. EmpRouter.java : Класс ресурсов, обрабатывающий различные виды запросов.
- @Путь(“/emp”) – Все запросы с URI
https://<ХОСТ>:<ПОРТ>/My-Jersey-Project/rest/emp/
будут обрабатываться этим классом ресурсов. - @Путь(“/getEmp”) – Все запросы с URI
https://<ХОСТ>:<ПОРТ>/My-Jersey-Project/rest/emp/getEmp
будут обработаны этим методом. - @POST – Эта аннотация определяет, что используемый метод HTTP должен быть POST. Некоторые другие возможные значения: @GET, @PUT, @DELETE
- @Потребляет(тип носителя.APPLICATION_XML) – Метод принимает XML-элемент
- @Производит(тип носителя.APPLICATION_XML) – Метод возвращает XML-элемент
package com.journaldev.router; import com.journaldev.exception.EmpNotFoundException; import com.journaldev.model.*; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.xml.bind.JAXBElement; @Path("/emp") public class EmpRouter { @POST @Path("/getEmp") @Consumes(MediaType.APPLICATION_XML) @Produces(MediaType.APPLICATION_XML) public Response getEmp(JAXBElementempRequest) throws EmpNotFoundException { EmpResponse empResponse = new EmpResponse(); if (empRequest.getValue().getId() == 1) { empResponse.setId(empRequest.getValue().getId()); empResponse.setName(empRequest.getValue().getName()); } else { throw new EmpNotFoundException("Wrong ID", empRequest.getValue() .getId()); } return Response.ok(empResponse).build(); } }
8. EmpNotFoundExceptionMapper.java : Класс сопоставления исключений, который сопоставляет исключение EmpNotFoundException объекту ответа. Класс должен иметь аннотацию @Provider. Этот класс должен быть в пакете, предусмотренном для классов ресурсов в web.xml. Реализация метода response()
генерирует объект ответа на ошибку и устанавливает его в качестве сущности в объекте ответа со статусом INTERNAL_SERVER_ERROR.
package com.journaldev.exceptionmapper; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; import com.journaldev.exception.EmpNotFoundException; import com.journaldev.model.ErrorResponse; @Provider public class EmpNotFoundExceptionMapper implements ExceptionMapper{ public EmpNotFoundExceptionMapper() { } public Response toResponse( EmpNotFoundException empNotFoundException) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setErrorId(empNotFoundException.getErrorId()); errorResponse.setErrorCode(empNotFoundException.getMessage()); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity( errorResponse).type( MediaType.APPLICATION_XML).build(); } }
Наш веб-сервис готов, просто создайте его, чтобы создать файл WAR и развернуть его на сервере приложений.
Пример клиента из Джерси
Мы можем использовать клиент Джерси для вызова нашей веб-службы и получения ответа программным способом.
EmpClient.java : Это пример программы java, с помощью которой вызывается наш веб-сервис. Мы используем API клиента Jersey для вызова службы и на основе статуса ответа анализируем объект ответа в класс EmpResponse или ErrorResponse.
package com.journaldev.client; import javax.ws.rs.core.MediaType; import com.journaldev.model.EmpRequest; import com.journaldev.model.EmpResponse; import com.journaldev.model.ErrorResponse; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; public class EmpClient { /** * @param args */ public static void main(String[] args) { String uri = "https://localhost:8080/My-Jersey-Project/rest/emp/getEmp"; EmpRequest request = new EmpRequest(); // set id as 1 for OK response request.setId(2); request.setName("PK"); try { Client client = Client.create(); WebResource r = client.resource(uri); ClientResponse response = r.type(MediaType.APPLICATION_XML).post(ClientResponse.class, request); System.out.println(response.getStatus()); if (response.getStatus() == 200) { EmpResponse empResponse = response.getEntity(EmpResponse.class); System.out.println(empResponse.getId() + "::" + empResponse.getName()); } else { ErrorResponse exc = response.getEntity(ErrorResponse.class); System.out.println(exc.getErrorCode()); System.out.println(exc.getErrorId()); } } catch (Exception e) { System.out.println(e.getMessage()); } } }
Реакция на Успех
Ответ на Ошибку
Резюме
В этом посте мы узнали, как создать веб-сервис REST с использованием API Jersey. Мы также изучили клиент Jersey, чтобы вызвать наши API REST с помощью программы java.