Рубрики
Без рубрики

Учебник по Java Джерси

Что такое Java Jersey Framework? Проект Джерси поддерживает API JAX-RS, который используется для создания веб-сервисов Restful на Java. Пример клиента из Джерси.

Автор оригинала: 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(JAXBElement empRequest)
			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.