REST API met Jersey en Spring

REST Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

Jersey is een open source framework voor het ontwikkelen van RESTful Web Services. Het dient als een referentie-implementatie van JAX-RS.

In dit artikel, we zullen de creatie van een RESTful Web Service onderzoeken met Jersey 2. We zullen ook Spring's Dependency Injection (DI) gebruiken met Java-configuratie.

2. Maven afhankelijkheden

Laten we beginnen met het toevoegen van afhankelijkheden aan het pom.xml:

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

Voor Spring-integratie moeten we ook de jersey-spring4 afhankelijkheid:

 org.glassfish.jersey.ext jersey-spring4 2.26 

De nieuwste versie van deze afhankelijkheden is beschikbaar op jersey-container-servlet, jersey-media-json-jackson en jersey-spring4.

3. Webconfiguratie

Vervolgens moeten we een webproject opzetten om Servlet-configuratie uit te voeren. Hiervoor gebruiken we Spring's WebApplicationInitializer:

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

Hier voegen we de @Order (Besteld.HIGHEST_PRECEDENCE) annotatie om ervoor te zorgen dat onze initialisatieprogramma wordt uitgevoerd vóór de standaardinitialisatie van Jersey-Spring.

4. Een service die Jersey JAX-RS gebruikt

4.1. Klasse voor representatie van bronnen

Laten we een voorbeeld van een resource-representatieklasse gebruiken:

@XmlRootElement openbare klasse Werknemer {privé int id; private String voornaam; // standaard getters en setters}

Merk op dat JAXB-annotaties zoals @XmlRootElement zijn alleen vereist als XML-ondersteuning nodig is (naast JSON).

4.2. Service-implementatie

Laten we nu kijken hoe we JAX-RS-annotaties kunnen gebruiken om RESTful-webservices te maken:

@Path ("/ workers") openbare klasse EmployeeResource {@Autowired privé EmployeeRepository employeeRepository; @GET @Path ("/ {id}") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) openbare medewerker getEmployee (@PathParam ("id") int id) {return employeeRepository.getEmployee (id); } @POST @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) openbare reactie addEmployee (Medewerker medewerker, @Context UriInfo uriInfo) {employeeRepository.addEmployee (nieuwe medewerker (employee.getId (), employee.getFirstName (), medewerker. getLastName (), employee.getAge ())); return Response.status (Response.Status.CREATED.getStatusCode ()) .header ("Location", String.format ("% s /% s", uriInfo.getAbsolutePath (). toString (), employee.getId ()) ).bouwen(); }}

De @Pad annotatie biedt het relatieve URI-pad naar de service. We kunnen ook variabelen insluiten in de URI-syntaxis, zoals de {ID kaart} variabele shows. Vervolgens worden de variabelen tijdens runtime vervangen. Om de waarde van de variabele te verkrijgen, kunnen we de @PathParam annotatie.

@KRIJGEN, @LEGGEN, @POST, @DELETE en @HOOFD definieer de HTTP-methode van het verzoek, die zal worden verwerkt door geannoteerde methoden.

De @Produceert annotatie definieert het reactietype van het eindpunt (MIME-mediatype). In ons voorbeeld hebben we het geconfigureerd om JSON of XML te retourneren, afhankelijk van de waarde van de HTTP-header Aanvaarden (applicatie / json of application / xml).

Aan de andere kant, het @Consumes annotatie definieert de MIME-mediatypen die de service kan gebruiken. In ons voorbeeld kan de service JSON of XML gebruiken, afhankelijk van de HTTP-header Inhoudstype (applicatie / json of application / xml).

De @Context annotatie wordt gebruikt om informatie in een klasseveld, bean-eigenschap of methodeparameter te injecteren. In ons voorbeeld gebruiken we het om te injecteren UriInfo. We kunnen het ook gebruiken om te injecteren ServletConfig, ServletContext, HttpServletRequest en HttpServletResponse.

5. Met behulp van ExceptionMapper

ExceptionMapper stelt ons in staat om de uitzonderingen te onderscheppen en de juiste HTTP-antwoordcode naar de klant terug te sturen. In het volgende voorbeeld wordt HTTP-antwoordcode 404 geretourneerd if WerknemerNietGevonden uitzondering wordt gegenereerd:

@Provider openbare klasse NotFoundExceptionHandler implementeert ExceptionMapper {openbare Response toResponse (EmployeeNotFound ex) {return Response.status (Response.Status.NOT_FOUND) .build (); }}

6. Beheer van resource klassen

Tenslotte, laten we alle service-implementatieklassen en uitzonderingsmappers aansluiten op een toepassingspad:

@ApplicationPath ("/ resources") public class RestConfig breidt Application {public Set getClasses () {retourneer nieuwe HashSet(Arrays.asList (EmployeeResource.class, NotFoundExceptionHandler.class, alExistsExceptionHandler.class)); }}

7. API-testen

Laten we nu de API's testen met enkele live tests:

openbare klasse JerseyApiLiveTest {privé statische laatste String SERVICE_URL = "// localhost: 8082 / spring-jersey / resources / werknemers"; @ Test openbare ongeldig gegeven GetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess () gooit ClientProtocolException, IOException {HttpUriRequest request = nieuwe HttpGet (SERVICE_URL); HttpResponse httpResponse = HttpClientBuilder .create () .build () .execute (verzoek); assertEquals (httpResponse .getStatusLine () .getStatusCode (), HttpStatus.SC_OK); }}

8. Conclusie

In dit artikel hebben we het Jersey-framework geïntroduceerd en een eenvoudige API ontwikkeld. We hebben Spring gebruikt voor Dependency Injection-functies. We hebben ook het gebruik van gezien ExceptionMapper.

Zoals altijd is de volledige broncode beschikbaar in dit Github-project.

REST onder

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS