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

БУДЬТЕ спокойны Учебник с Eclipse и Tomcat

Легкий учебник. Простой Пример. Пример Java RESTEasy с использованием Eclipse и Tomcat. Фреймворк JBoss RESTEasy, пример программного кода клиента RESTEasy.

Автор оригинала: Pankaj Kumar.

Добро пожаловать в учебник по отдыху. RESTEasy – это реализация JAX-RS, предоставляемая проектом JBoss. Мы можем использовать REST Easy для создания веб-сервисов restful. RESTEasy обеспечивает более тесную интеграцию с сервером приложений JBoss, но мы можем развернуть его в любом контейнере сервлетов. Итак, сегодня мы узнаем, как создать restful веб-сервис с помощью RestEasy framework и развернуть его в контейнере сервлетов Tomcat для его тестирования.

Легкий учебник

Некоторые из особенностей RESTEasy framework заключаются в следующем:

  • Совместимость с API JAX-RS – поэтому в основном вам нужно подключить его к кодированию API JAX-RS для создания веб-служб rest.
  • Работает практически на любом контейнере сервлетов, поддерживающем Java 6 или выше
  • Обеспечивает поддержку написания клиентских программ с использованием клиентского API JAX-RS 2.0. Мы также рассмотрим программу тестирования.
  • Богатый набор поставщиков – XML, JSON, YAML, Multipart, XOP, Atom и т.д.
  • OAuth2 и Распределенный единый вход с JBoss AS7
  • Интеграция EJB, Seam, Guice, Spring и Spring MVC

Простой Пример

Ниже приведены URI, которые мы будем раскрывать в нашей реализации веб-службы RestEasy.

/сотрудник/добавить Добавьте сотрудника ПОСТ
/сотрудник/getDummy возвращает фиктивный объект сотрудника ПОЛУЧИТЬ
/сотрудник/{идентификатор}/получить Получите сотрудника с “идентификатором” в URL-адресе ПОЛУЧИТЬ
/сотрудник/GetAll Соберите всех сотрудников ПОЛУЧИТЬ
/сотрудник/{идентификатор}/удалить Удалите сотрудника с “идентификатором” в URL-адресе УДАЛИТЬ

Простой пример проекта Eclipse

На рисунке ниже показана наша окончательная структура проекта. Прежде всего, создайте “Динамическое веб-приложение” в Eclipse, а затем преобразуйте его в проект Maven, чтобы получить скелет веб-проекта.

Давайте рассмотрим различные компоненты нашего проекта веб-сервисов RestEasy.

Повторите Примеры Классов Моделей

У нас есть два класса моделей – Сотрудник для объекта сотрудник и GenericResponse для отправки объекта ответа клиента для статуса, сообщения и кода ошибки.

package com.journaldev.jaxrs.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "employee")
public class Employee {
	private String name;
	private double salary;
	private int id;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return id + "::" + name + "::" + salary;
	}

}
package com.journaldev.jaxrs.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "response")
public class GenericResponse {

	private boolean status;
	private String message;
	private String errorCode;

	public boolean isStatus() {
		return status;
	}

	public void setStatus(boolean status) {
		this.status = status;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public String getErrorCode() {
		return errorCode;
	}

	public void setErrorCode(String errorCode) {
		this.errorCode = errorCode;
	}

	@Override
	public String toString() {
		return status + "|" + message + "|" + errorCode;
	}
}

Обратите внимание, что оба компонента java аннотированы аннотацией @XmlRootElement . Это требуется для API JAXB для преобразования объектов в xml и наоборот.

Примеры классов обслуживания RESTEasy

Давайте сначала создадим интерфейс для всех операций, которые мы пытаемся представить в нашем веб-сервисе restful.

package com.journaldev.jaxrs.service;

import javax.ws.rs.core.Response;

import com.journaldev.jaxrs.model.Employee;

public interface EmployeeService {

	public Response addEmployee(Employee e);
	
	public Response deleteEmployee(int id);
	
	public Employee getEmployee(int id);
	
	public Employee[] getAllEmployees();

}

Ниже приведен класс реализации для вышеуказанного интерфейса обслуживания сотрудников.

package com.journaldev.jaxrs.service;


import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.journaldev.jaxrs.model.Employee;
import com.journaldev.jaxrs.model.GenericResponse;

@Path("/employee")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class EmployeeServiceImpl implements EmployeeService {

	private static Map emps = new HashMap();
	
	@Override
	@POST
    @Path("/add")
	public Response addEmployee(Employee e) {
		GenericResponse response = new GenericResponse();
		if(emps.get(e.getId()) != null){
			response.setStatus(false);
			response.setMessage("Employee Already Exists");
			response.setErrorCode("EC-01");
			return Response.status(422).entity(response).build();
		}
		emps.put(e.getId(), e);
		response.setStatus(true);
		response.setMessage("Employee created successfully");
		return Response.ok(response).build();
	}

	@Override
	@DELETE
    @Path("/{id}/delete")
	public Response deleteEmployee(@PathParam("id") int id) {
		GenericResponse response = new GenericResponse();
		if(emps.get(id) == null){
			response.setStatus(false);
			response.setMessage("Employee Doesn't Exists");
			response.setErrorCode("EC-02");
			return Response.status(404).entity(response).build();
		}
		emps.remove(id);
		response.setStatus(true);
		response.setMessage("Employee deleted successfully");
		return Response.ok(response).build();
	}

	@Override
	@GET
	@Path("/{id}/get")
	public Employee getEmployee(@PathParam("id") int id) {
		return emps.get(id);
	}
	
	@GET
	@Path("/{id}/getDummy")
	public Employee getDummyEmployee(@PathParam("id") int id) {
		Employee e = new Employee();
		e.setSalary(8976.55);
		e.setName("Dummy");
		e.setId(id);
		return e;
	}

	@Override
	@GET
	@Path("/getAll")
	public Employee[] getAllEmployees() {
		Set ids = emps.keySet();
		Employee[] e = new Employee[ids.size()];
		int i=0;
		for(Integer id : ids){
			e[i] = emps.get(id);
			i++;
		}
		return e;
	}

}

Мы используем только аннотации API JAX-RS, такие как @Путь , @Путь , Ответ и т.д. Обратите внимание, что я использую javax.ws.rs.core.Ответ как объект ответа в некоторых методах, в которых я хочу отправить код состояния HTTP, отличный от 200.

Повторная настройка

До сих пор мы не делали ничего, связанного с Rest Easy, теперь пришло время настроить RestEasy в качестве нашей реализации API JAX-RS для нашего веб-сервиса restful.

Первым шагом является расширение javax.ws.rs.core.Приложение класс и переопределить несколько методов для внедрения нашей реализации класса обслуживания.

package com.journaldev.jaxrs.resteasy.app;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import com.journaldev.jaxrs.service.EmployeeServiceImpl;

public class EmployeeApplication extends Application {
	
	private Set singletons = new HashSet();

	public EmployeeApplication() {
		singletons.add(new EmployeeServiceImpl());
	}

	@Override
	public Set getSingletons() {
		return singletons;
	}

}

Следующим шагом является добавление зависимостей RESTEasy maven в ваш pom.xml файл, как показано ниже.


	org.jboss.resteasy
	resteasy-jaxrs
	3.0.13.Final



	org.jboss.resteasy
	resteasy-jaxb-provider
	3.0.13.Final

Последним шагом является настройка класса сервлета RESTEasy в дескрипторе развертывания в качестве переднего контроллера.



  RestEasy-Example
  
    
         org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
      
  
  
    resteasy-servlet
    
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        
    
      javax.ws.rs.Application
      com.journaldev.jaxrs.resteasy.app.EmployeeApplication
    
  
  
    resteasy-servlet
    /*
  

Вот и все. Наш веб-сервис готов. Вы можете видеть, как легко было подключить Rest Easy в качестве нашей реализации JAX-RS для веб-сервиса restful.

Тест веб-службы RESTEasy Restful

Я использую расширение Chrome Postman для тестирования нашего веб-сервиса. Ниже приведены некоторые из тестовых примеров с ответом. Одной общей частью являются заголовки во всех запросах, как показано на рисунке ниже.

  1. получить Манекен
  2. добавлять
  3. получить
  4. Получить все
  5. удалить
  6. добавить ошибку – HTTP-ответ 422
  7. удалить ошибку – HTTP-ответ 404

Как вы можете видеть, все тесты прошли с честью, наш веб-сервис rest работает нормально.

RestEasy Клиент – пример ResteasyClient

Как я упоминал ранее, RestEasy также предоставляет API для тестирования веб-служб rest с помощью программы java. Для этого нам нужно добавить еще одну зависимость в ваш pom.xml файл.


	org.jboss.resteasy
	resteasy-client
	3.0.13.Final

Ниже приведена простая тестовая программа, в которой я программно тестирую наш веб-сервис. Я привожу пример для тестирования методов HTTP GET, POST и DELETE.

package com.journaldev.jaxrs.resteasy.client;

import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;

import com.journaldev.jaxrs.model.Employee;
import com.journaldev.jaxrs.model.GenericResponse;

public class RestEasyTestClient {

	public static void main(String[] args) {

		ResteasyClient client = new ResteasyClientBuilder().build();
		
		//GET example
		ResteasyWebTarget getDummy = client.target("https://localhost:8080/RestEasy-Example/employee/99/getDummy");
		
		Response getDummyResponse = getDummy.request().get();
		
		String value = getDummyResponse.readEntity(String.class);
        System.out.println(value);
        getDummyResponse.close();  
        
        //POST example
		ResteasyWebTarget add = client.target("https://localhost:8080/RestEasy-Example/employee/add");
		Employee emp = new Employee();
		emp.setId(50);emp.setName("Rick");emp.setSalary(1000);
		Response addResponse = add.request().post(Entity.entity(emp, MediaType.APPLICATION_XML));
		System.out.println(addResponse.readEntity(GenericResponse.class));
		System.out.println("HTTP Response Code:"+addResponse.getStatus());
		addResponse.close();
		
		addResponse = add.request().post(Entity.entity(emp, MediaType.APPLICATION_XML));
		System.out.println(addResponse.readEntity(GenericResponse.class));
		System.out.println("HTTP Response Code:"+addResponse.getStatus());
		addResponse.close();
		
		//DELETE example
		ResteasyWebTarget delete = client.target("https://localhost:8080/RestEasy-Example/employee/50/delete");
		Response deleteResponse = delete.request().delete();
		System.out.println(deleteResponse.readEntity(GenericResponse.class));
		System.out.println("HTTP Response Code:"+deleteResponse.getStatus());
		deleteResponse.close();
		
		deleteResponse = delete.request().delete();
		System.out.println(deleteResponse.readEntity(GenericResponse.class));
		System.out.println("HTTP Response Code:"+deleteResponse.getStatus());
		deleteResponse.close();
	}

}

Ниже приведен результат, полученный вышеупомянутой клиентской программой RESTEasy.


99Dummy8976.55
true|Employee created successfully|null
HTTP Response Code:200
false|Employee Already Exists|EC-01
HTTP Response Code:422
true|Employee deleted successfully|null
HTTP Response Code:200
false|Employee Doesn't Exists|EC-02
HTTP Response Code:404

Это все для легкого урока. RESTEasy-это очень простая платформа для простого создания веб-сервисов Restful на java. Вы можете скачать проект по ссылке ниже и поиграть с ним, чтобы узнать больше.