REST API med Jersey og Spring
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 KURSET1. 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