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 Kurs1. Ü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