REST API mit Jersey und Spring

REST Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

Jersey ist ein Open Source Framework für die Entwicklung von RESTful Web Services. Es dient als Referenzimplementierung von JAX-RS.

In diesem Artikel untersuchen wir die Erstellung eines RESTful-Webdienstes mit Jersey 2 . Außerdem verwenden wir Spring's Dependency Injection (DI) mit Java-Konfiguration.

2. Maven-Abhängigkeiten

Beginnen wir mit dem Hinzufügen von Abhängigkeiten zur pom.xml :

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

Für die Spring-Integration müssen wir außerdem die Abhängigkeit jersey-spring4 hinzufügen :

 org.glassfish.jersey.ext jersey-spring4 2.26 

Die neueste Version dieser Abhängigkeiten ist bei jersey-container-servlet, jersey-media-json-jackson und jersey-spring4 erhältlich.

3. Webkonfiguration

Als Nächstes müssen wir ein Webprojekt einrichten, um die Servlet-Konfiguration durchzuführen. Dazu verwenden wir den WebApplicationInitializer von 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"); } }

Hier fügen wir die Annotation @Order (Ordered.HIGHEST_PRECEDENCE) hinzu, um sicherzustellen, dass unser Initialisierer vor dem Standardinitialisierer von Jersey-Spring ausgeführt wird.

4. Ein Dienst mit Jersey JAX-RS

4.1. Ressourcendarstellungsklasse

Verwenden wir eine Beispielklasse für die Darstellung von Ressourcen:

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

Beachten Sie, dass JAXB-Annotationen wie @XmlRootElement nur erforderlich sind, wenn XML-Unterstützung benötigt wird (zusätzlich zu JSON).

4.2. Service-Implementierung

Schauen wir uns nun an, wie wir JAX-RS-Annotationen verwenden können, um RESTful-Webdienste zu erstellen:

@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(); } }

Die Annotation @Path gibt den relativen URI-Pfad zum Dienst an. Wir können auch Variablen in die URI-Syntax einbetten, wie die Variable {id} zeigt. Anschließend werden die Variablen zur Laufzeit ersetzt. Um den Wert der Variablen zu erhalten, können Sie die Annotation @PathParam verwenden .

@GET , @PUT , @POST, @DELETE und @HEAD definieren die HTTP-Methode der Anforderung , die von mit Anmerkungen versehenen Methoden verarbeitet wird.

Die Annotation @Produces definiert den Antworttyp des Endpunkts (MIME-Medientyp). In unserem Beispiel haben wir es so konfiguriert, dass es je nach Wert des HTTP-Headers Accept ( application / json oder application / xml ) entweder JSON oder XML zurückgibt .

Andererseits definiert die Annotation @Consumes die MIME-Medientypen, die der Dienst verwenden kann. In unserem Beispiel kann der Dienst je nach Inhaltstyp des HTTP-Headers ( application / json oder application / xml ) entweder JSON oder XML verwenden .

Die Annotation @Context wird verwendet, um Informationen in ein Klassenfeld, eine Bean-Eigenschaft oder einen Methodenparameter einzufügen. In unserem Beispiel verwenden wir es, um UriInfo zu injizieren . Wir können es auch verwenden, um ServletConfig , ServletContext , HttpServletRequest und HttpServletResponse zu injizieren .

5. Verwenden von ExceptionMapper

Mit ExceptionMapper können wir die Ausnahmen abfangen und den entsprechenden HTTP-Antwortcode an den Client zurückgeben. Im folgenden Beispiel wird der HTTP-Antwortcode 404 zurückgegeben, wenn die EmployeeNotFound- Ausnahme ausgelöst wird:

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

6. Verwalten von Ressourcenklassen

Schließlich wollen wir verdrahten alle Service - Implementierungsklassen und Ausnahme - Mapper gegen einen Anwendungspfad:

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

7. API-Tests

Lassen Sie uns nun die APIs mit einigen Live-Tests testen:

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. Fazit

In diesem Artikel haben wir das Jersey-Framework vorgestellt und eine einfache API entwickelt. Wir haben Spring for Dependency Injection-Funktionen verwendet. Wir haben auch die Verwendung von ExceptionMapper gesehen .

Wie immer ist der vollständige Quellcode in diesem Github-Projekt verfügbar.

REST unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs