REST API med Jersey og Spring

REST Topp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

Jersey er et open source-rammeverk for utvikling av RESTful Web Services. Den fungerer som en referanseimplementering av JAX-RS.

I denne artikkelen, Vi vil utforske etableringen av en RESTful Web Service ved hjelp av Jersey 2. Vi bruker også Spring's Dependency Injection (DI) med Java-konfigurasjon.

2. Maven-avhengigheter

La oss begynne med å legge til avhengigheter til pom.xml:

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

Også for vårintegrasjon må vi legge til jersey-spring4 avhengighet:

 org.glassfish.jersey.ext jersey-spring4 2.26 

Den siste versjonen av disse avhengighetene er tilgjengelig på jersey-container-servlet, jersey-media-json-jackson og jersey-spring4.

3. Nettkonfigurasjon

Deretter må vi sette opp et webprosjekt for å utføre Servlet-konfigurasjon. For dette bruker vi Spring's WebApplicationInitializer:

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

Her legger vi til @ Bestilling (bestilt. HIGHEST_PRECEDENCE) kommentar for å sikre at initialisereren vår kjøres før Jersey-Spring standardinitialiseringen.

4. En tjeneste som bruker Jersey JAX-RS

4.1. Ressursrepresentasjonsklasse

La oss bruke en eksempelressursrepresentasjonsklasse:

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

Merk at JAXB-merknader som @XmlRootElement kreves bare hvis XML-støtte er nødvendig (i tillegg til JSON).

4.2. Tjenesteimplementering

La oss nå se på hvordan vi kan bruke JAX-RS-merknader til å lage RESTful webtjenester:

@Path ("/ ansatte") offentlig klasse EmployeeResource {@Autowired private EmployeeRepository employeeRepository; @GET @Path ("/ {id}") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) offentlig ansatt getEmployee (@PathParam ("id") int id) {retur medarbeiderRepository.getEmployee (id); } @POST @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) offentlig respons addEmployee (ansatt ansatt, @Context UriInfo uriInfo) {workerRepository.addEmployee (ny ansatt (ansatt.getId (), ansatt.getFirstName (), ansatt. getLastName (), medarbeider.getAge ())); return Response.status (Response.Status.CREATED.getStatusCode ()). header ("Location", String.format ("% s /% s", uriInfo.getAbsolutePath (). toString (), medarbeider.getId ()) ).bygge(); }}

De @Sti kommentar gir den relative URI-banen til tjenesten. Vi kan også legge inn variabler i URI-syntaksen, som {id} variabel viser. Deretter vil variablene erstattes ved kjøretid. For å oppnå verdien av variabelen vi kan bruke @PathParam kommentar.

@FÅ, @SETTE, @POST, @DELETE og @HODE definere HTTP-metoden for forespørselen, som vil bli behandlet etter merkede metoder.

De @Produkter merknad definerer sluttpunktets svarstype (MIME-medietype). I vårt eksempel har vi konfigurert den til å returnere enten JSON eller XML, avhengig av verdien av HTTP-overskrift Aksepterer (søknad / json eller applikasjon / xml).

På den andre siden, @forbruket kommentar definerer MIME-medietypene som tjenesten kan konsumere. I vårt eksempel kan tjenesten konsumere enten JSON eller XML, avhengig av HTTP-overskriften Innholdstype (søknad / json eller applikasjon / xml).

De @Kontekst kommentar brukes til å injisere informasjon i et klassefelt, bønneegenskap eller metodeparameter. I vårt eksempel bruker vi den til å injisere UriInfo. Vi kan også bruke den til å injisere ServletConfig, ServletContext, HttpServletRequest og HttpServletResponse.

5. Bruke ExceptionMapper

ExceptionMapper lar oss fange opp unntakene og returnere passende HTTP-responskode til klienten. I det følgende eksemplet returneres HTTP-svarskode 404 hvis EmployeeNotFound unntaket blir kastet:

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

6. Administrere ressursklasser

Endelig, la oss koble opp alle tjenesteimplementeringsklasser og unntakskartleggere mot en applikasjonssti:

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

7. API-testing

La oss nå teste API-ene med noen live tester:

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

8. Konklusjon

I denne artikkelen har vi introdusert Jersey-rammeverket og utviklet et enkelt API. Vi har brukt Spring for funksjoner for avhengighetsinjeksjon. Vi har også sett bruken av ExceptionMapper.

Som alltid er hele kildekoden tilgjengelig i dette Github-prosjektet.

HVILLE bunnen

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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