REST API med Jersey og Spring

REST Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

Jersey er en open source-ramme til udvikling af RESTful Web Services. Det fungerer som en referenceimplementering af JAX-RS.

I denne artikel vi undersøger oprettelsen af ​​en RESTful Web Service ved hjælp af Jersey 2. Vi bruger også Spring's Dependency Injection (DI) med Java-konfiguration.

2. Maven-afhængigheder

Lad os begynde med at tilføje afhængigheder til pom.xml:

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

Også for foråret integration er vi nødt til at tilføje trøje-spring4 afhængighed:

 org.glassfish.jersey.ext jersey-spring4 2.26 

Den seneste version af disse afhængigheder er tilgængelig på jersey-container-servlet, jersey-media-json-jackson og jersey-spring4.

3. Webkonfiguration

Dernæst skal vi oprette et webprojekt til at udføre Servlet-konfiguration. Til dette bruger vi Spring's WebApplicationInitializer:

@Order (Ordered.HIGHEST_PRECEDENCE) offentlig klasse ApplicationInitializer implementerer WebApplicationInitializer {@Override public void onStartup (ServletContext servletContext) kaster ServletException {AnnotationConfigWebApplicationContext context = new AnnotationConfigWeblicationConfigWebApplicationContext servletContext.addListener (ny ContextLoaderListener (kontekst)); servletContext.setInitParameter ("contextConfigLocation", "com.baeldung.server"); }}

Her tilføjer vi @ Bestil (bestilt. HIGHEST_PRECEDENCE) kommentar for at sikre, at vores initialisering udføres før Jersey-Spring-standardinitialiseringen.

4. En service, der bruger Jersey JAX-RS

4.1. Ressourcerepræsentationsklasse

Lad os bruge en prøveressourcerepræsentationsklasse:

@XmlRootElement offentlig klasse medarbejder {privat int id; privat streng fornavn; // standard getters og setter}

Bemærk, at JAXB-kommentarer kan lide @XmlRootElement kræves kun, hvis der er behov for XML-support (ud over JSON).

4.2. Serviceimplementering

Lad os nu se på, hvordan vi kan bruge JAX-RS-kommentarer til at oprette RESTful webtjenester:

@Path ("/ medarbejdere") offentlig klasse EmployeeResource {@Autowired private EmployeeRepository medarbejderRepository; @GET @Path ("/ {id}") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) offentlig medarbejder getEmployee (@PathParam ("id") int id) {return medarbejderRepository.getEmployee (id); } @POST @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) offentlig reaktion addEmployee (Medarbejdermedarbejder, @Context UriInfo uriInfo) {medarbejderRepository.addEmployee (ny medarbejder (medarbejder.getId (), medarbejder.getFirstName (), medarbejder). getLastName (), medarbejder.getAge ())); returnere Response.status (Response.Status.CREATED.getStatusCode ()). header ("Location", String.format ("% s /% s", uriInfo.getAbsolutePath (). toString (), medarbejder.getId ()) ) .build (); }}

Det @Sti annotation giver den relative URI-sti til tjenesten. Vi kan også integrere variabler inden for URI-syntaksen, som {id} variabel viser. Derefter erstattes variablerne ved kørsel. For at opnå værdien af ​​variablen kan vi bruge @PathParam kommentar.

@FÅ, @SÆTTE, @POST, @DELETE og @HOVED definere HTTP-metoden for anmodningen, som behandles efter annoterede metoder.

Det @Produces annotation definerer slutpunktets svarstype (MIME-medietype). I vores eksempel har vi konfigureret det til at returnere enten JSON eller XML afhængigt af værdien af ​​HTTP-header Acceptere (ansøgning / json eller applikation / xml).

På den anden side, @forbruget annotation definerer de MIME-medietyper, som tjenesten kan forbruge. I vores eksempel kan tjenesten forbruge enten JSON eller XML afhængigt af HTTP-headeren Indholdstype (ansøgning / json eller applikation / xml).

Det @Sammenhæng annotation bruges til at indsprøjte information i et klassefelt, bønneegenskab eller metodeparameter. I vores eksempel bruger vi det til at injicere UriInfo. Vi kan også bruge det til at injicere ServletConfig, ServletContext, HttpServletRequest og HttpServletResponse.

5. Brug ExceptionMapper

ExceptionMapper giver os mulighed for at opfange undtagelserne og returnere passende HTTP-svarskode til klienten. I det følgende eksempel returneres HTTP-svarskode 404, hvis MedarbejderNotFound undtagelse kastes:

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

6. Håndtering af ressourceklasser

Langt om længe, lad os koble alle serviceimplementeringsklasser og undtagelseskortlæggere mod en applikationssti:

@ApplicationPath ("/ resources") offentlig klasse RestConfig udvider Application {public Set getClasses () {returner nyt HashSet(Arrays.asList (EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); }}

7. API-test

Lad os nu teste API'erne med nogle live-tests:

offentlig klasse JerseyApiLiveTest {privat statisk endelig streng SERVICE_URL = "// localhost: 8082 / spring-jersey / resources / ansatte"; @Test offentlig ugyldighed givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess () kaster ClientProtocolException, IOException {HttpUriRequest anmodning = ny HttpGet (SERVICE_URL); HttpResponse httpResponse = HttpClientBuilder .create () .build () .execute (anmodning); assertEquals (httpResponse .getStatusLine () .getStatusCode (), HttpStatus.SC_OK); }}

8. Konklusion

I denne artikel har vi introduceret Jersey-rammen og udviklet en simpel API. Vi har brugt Spring til funktioner til afhængighedsinjektion. Vi har også set brugen af ExceptionMapper.

Som altid er den fulde kildekode tilgængelig i dette Github-projekt.

REST bunden

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

$config[zx-auto] not found$config[zx-overlay] not found