REST API Jersey-vel és Spring-szel

REST felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Jersey egy nyílt forráskódú keretrendszer a RESTful Web Services fejlesztéséhez. A JAX-RS referencia megvalósításaként szolgál.

Ebben a cikkben, felfedezzük egy RESTful webszolgáltatás létrehozását a Jersey 2 segítségével. Ezenkívül használjuk a Spring's Dependency Injection (DI) Java konfigurációval.

2. Maven-függőségek

Kezdjük azzal, hogy függőségeket adunk a pom.xml:

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

A tavaszi integrációhoz hozzá kell adnunk a mez-tavasz4 függőség:

 org.glfishfish.jersey.ext jersey-spring4 2.26 

Ezeknek a függőségeknek a legújabb verziója a jersey-container-servlet, a jersey-media-json-jackson és a jersey-spring4 címen érhető el.

3. Webkonfiguráció

Ezután fel kell állítanunk egy webprojektet a Servlet konfigurálásához. Ehhez a Spring-et fogjuk használni WebApplicationInitializer:

A @Order (Ordered.HIGHEST_PRECEDENCE) public class ApplicationInitializer végrehajtja a WebApplicationInitializer {@Orride public void onStartup (ServletContext servletContext) dob ServletException {AnnotationConfigWebApplicationContext context = new AnnotationConfigWon servletContext.addListener (új ContextLoaderListener (context)); servletContext.setInitParameter ("contextConfigLocation", "com.baeldung.server"); }}

Itt adjuk hozzá a @Rendelés (Rendelt. HIGHEST_PRECEDENCE) megjegyzés annak biztosítására, hogy az inicializálónkat a Jersey-Spring alapértelmezett inicializáló előtt hajtják végre.

4. A Jersey JAX-RS szolgáltatást használó szolgáltatás

4.1. Erőforrás-reprezentációs osztály

Használjunk egy erőforrás-reprezentációs osztályt:

@XmlRootElement public class Employee {private int id; privát karakterlánc keresztnév; // szabványos mérőeszközök és beállítók}

Ne feledje, hogy a JAXB annotációk tetszik @XmlRootElement csak akkor szükségesek, ha XML támogatásra van szükség (a JSON mellett).

4.2. Szolgáltatás megvalósítása

Most nézzük meg, hogyan használhatjuk a JAX-RS kommentárokat a RESTful webszolgáltatások létrehozásához:

@Path ("/ alkalmazottak") public class EmployeeResource {@Autowired private EmployeeRepository workerRepository; @GET @Path ("/ {id}") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Employee getEmployee (@PathParam ("id") int id) {return workerRepository.getEmployee (id); } @POST @Cumsumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Response addEmployee (Employee worker, @Context UriInfo uriInfo) {workerRepository.addEmployee (new Employee (alkalmazott.getId (alkalmazott) (alkalmazott. getLastName (), alkalmazott.getAge ())); return Response.status (Response.Status.CREATED.getStatusCode ()) .header ("Location", String.format ("% s /% s", uriInfo.getAbsolutePath (). toString (), worker.getId ()) ).épít(); }}

A @Pálya annotáció adja meg a szolgáltatás relatív URI elérési útját. Beágyazhatunk változókat az URI szintaxisába is, mint a {id} változó azt mutatja. Ezután a változókat futás közben helyettesítik. A változó értékének megszerzéséhez használhatjuk a @PathParam annotáció.

@KAP, @PUT, @POST, @TÖRÖL és @FEJ határozza meg a kérés HTTP módszerét, amelyet annotált módszerekkel fogunk feldolgozni.

A @Termékek az annotáció határozza meg a végpont válasz típusát (MIME adathordozó típusa). Példánkban úgy konfiguráltuk, hogy a HTTP fejléc értékétől függően JSON-t vagy XML-t adjon vissza Elfogad (alkalmazás / json vagy application / xml).

Másrészről, a @Fogyaszt az annotáció meghatározza azokat a MIME adathordozókat, amelyeket a szolgáltatás felhasználhat. Példánkban a szolgáltatás akár JSON-t, akár XML-t fogyaszthat a HTTP fejléctől függően Tartalom típus (alkalmazás / json vagy application / xml).

A @Kontextus az annotációval információkat lehet besorolni egy osztálymezőbe, bab tulajdonságba vagy metódus paraméterbe. Példánkban injekciózásra használjuk UriInfo. Injekcióhoz is használhatjuk ServletConfig, ServletContext, HttpServletRequest és HttpServletResponse.

5. Használata ExceptionMapper

ExceptionMapper lehetővé teszi számunkra, hogy elfogjuk a kivételeket, és a megfelelő HTTP válaszkódot visszaküldjük az ügyfélnek. Az alábbi példában a 404 HTTP válaszkódot adja vissza, ha EmployeeNotFound kivételt dobnak:

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

6. Erőforrásosztályok kezelése

Végül, kössük össze az összes szolgáltatás implementációs osztályt és kivétel-hozzárendelőt egy alkalmazás elérési útjával:

A @ApplicationPath ("/ resources") nyilvános osztály, a RestConfig kiterjeszti a (z) {public Set alkalmazást getClasses () {return new HashSet(Arrays.asList (EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); }}

7. API tesztelés

Most teszteljük az API-kat néhány élő teszttel:

nyilvános osztály JerseyApiLiveTest {private static final String SERVICE_URL = "// localhost: 8082 / spring-jersey / resources / alkalmazottak"; @Test public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess () dobja a ClientProtocolException, IOException {HttpUriRequest request = new HttpGet (SERVICE_URL); HttpResponse httpResponse = HttpClientBuilder .create () .build () .execute (request); assertEquals (httpResponse .getStatusLine () .getStatusCode (), HttpStatus.SC_OK); }}

8. Következtetés

Ebben a cikkben bemutattuk a Jersey keretrendszert és kifejlesztettünk egy egyszerű API-t. A Spring for Dependency Injection funkciókat használtuk. Láttuk a használatát is ExceptionMapper.

Mint mindig, a teljes forráskód is elérhető ebben a Github projektben.

REST alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

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