REST API с Джърси и Пролет

ПОЧИВКА Най-горе

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

Джърси е рамка с отворен код за разработване на RESTful Web Services. Той служи като референтно изпълнение на JAX-RS.

В тази статия ще изследваме създаването на RESTful уеб услуга, използвайки Jersey 2 . Също така ще използваме Spring's Dependency Injection (DI) с Java конфигурация.

2. Зависимости на Maven

Нека започнем с добавяне на зависимости към pom.xml :

 org.glassfish.jersey.containers jersey-container-servlet 2.26   org.glassfish.jersey.media jersey-media-json-jackson 2.26 

Също така, за пролетната интеграция трябва да добавим зависимостта jersey-spring4 :

 org.glassfish.jersey.ext jersey-spring4 2.26 

Най-новата версия на тези зависимости е налична в jersey-container-servlet, jersey-media-json-jackson и jersey-spring4.

3. Уеб конфигурация

След това трябва да настроим уеб проект за конфигуриране на Servlet. За целта ще използваме WebApplicationInitializer на Spring :

@Order(Ordered.HIGHEST_PRECEDENCE) public class ApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); servletContext.addListener(new ContextLoaderListener(context)); servletContext.setInitParameter( "contextConfigLocation", "com.baeldung.server"); } }

Тук добавяме анотацията @Order (Ordered.HIGHEST_PRECEDENCE), за да гарантираме, че инициализаторът ни се изпълнява преди инициализатора по подразбиране Jersey-Spring.

4. Услуга, използваща Джърси JAX-RS

4.1. Клас на представяне на ресурса

Нека използваме примерен клас за представяне на ресурс:

@XmlRootElement public class Employee { private int id; private String firstName; // standard getters and setters }

Имайте предвид, че JAXB анотации като @XmlRootElement се изискват само ако е необходима XML поддръжка (в допълнение към JSON).

4.2. Внедряване на услугата

Нека сега разгледаме как можем да използваме анотации JAX-RS за създаване на RESTful уеб услуги:

@Path("/employees") public class EmployeeResource { @Autowired private EmployeeRepository employeeRepository; @GET @Path("/{id}") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public Employee getEmployee(@PathParam("id") int id) { return employeeRepository.getEmployee(id); } @POST @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public Response addEmployee( Employee employee, @Context UriInfo uriInfo) { employeeRepository.addEmployee(new Employee(employee.getId(), employee.getFirstName(), employee.getLastName(), employee.getAge())); return Response.status(Response.Status.CREATED.getStatusCode()) .header( "Location", String.format("%s/%s",uriInfo.getAbsolutePath().toString(), employee.getId())).build(); } }

В @Path анотацията осигурява относителна URI пътя към услугата. Също така можем да вградим променливи в синтаксиса на URI, както показва променливата {id} . След това променливите ще бъдат заменени по време на изпълнение. За да получим стойността на променливата, можем да използваме анотацията @PathParam .

@GET , @PUT , @POST, @DELETE и @HEAD дефинират HTTP метода на заявката , който ще бъде обработен чрез анотирани методи.

В @Produces анотация определя типа на крайна точка за реагиране (MIME тип носител). В нашия пример сме го конфигурирали да връща JSON или XML в зависимост от стойността на HTTP заглавката Accept ( application / json или application / xml ).

От друга страна, анотацията @Consumes дефинира типовете MIME носители, които услугата може да консумира. В нашия пример услугата може да използва JSON или XML в зависимост от HTTP заглавката Content-Type ( application / json или application / xml ).

В @Context анотацията се използва за инжектиране на информация в поле клас, боб свойство или метод параметър. В нашия пример го използваме за инжектиране на UriInfo . Можем да го използваме и за инжектиране на ServletConfig , ServletContext , HttpServletRequest и HttpServletResponse.

5. Използване на ExceptionMapper

ExceptionMapper ни позволява да прихващаме изключенията и да връщаме подходящия HTTP код за отговор на клиента. В следния пример се връща код за отговор на HTTP 404, ако се хвърли изключение EmployeeNotFound :

@Provider public class NotFoundExceptionHandler implements ExceptionMapper { public Response toResponse(EmployeeNotFound ex) { return Response.status(Response.Status.NOT_FOUND).build(); } }

6. Управление на ресурсни класове

И накрая, нека свържем всички класове за внедряване на услуги и картографиращи изключения срещу пътя на приложението:

@ApplicationPath("/resources") public class RestConfig extends Application { public Set
    
      getClasses() { return new HashSet
     
      ( Arrays.asList( EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); } }
     
    

7. API тестване

Нека сега тестваме API с някои тестове на живо:

public class JerseyApiLiveTest { private static final String SERVICE_URL = "//localhost:8082/spring-jersey/resources/employees"; @Test public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess() throws ClientProtocolException, IOException { HttpUriRequest request = new HttpGet(SERVICE_URL); HttpResponse httpResponse = HttpClientBuilder .create() .build() .execute(request); assertEquals(httpResponse .getStatusLine() .getStatusCode(), HttpStatus.SC_OK); } }

8. Заключение

В тази статия въведохме рамката на Джърси и разработихме прост API. Използвахме Spring за функции за инжектиране на зависимост. Виждали сме и използването на ExceptionMapper .

Както винаги, пълният изходен код е наличен в този проект на Github.

ПОЧИВКА отдолу

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА