Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:
>> SEMAK KURSUS1. Gambaran keseluruhan
Jersey adalah kerangka sumber terbuka untuk mengembangkan RESTful Web Services. Ia berfungsi sebagai rujukan pelaksanaan JAX-RS.
Dalam artikel ini, kami akan meneroka penciptaan RESTful Web Service menggunakan Jersey 2 . Juga, kami akan menggunakan Spring's Dependency Injection (DI) dengan konfigurasi Java.
2. Pergantungan Maven
Mari mulakan dengan menambahkan kebergantungan pada pom.xml :
org.glassfish.jersey.containers jersey-container-servlet 2.26 org.glassfish.jersey.media jersey-media-json-jackson 2.26
Juga, untuk integrasi Spring kita harus menambahkan kebergantungan jersey-spring4 :
org.glassfish.jersey.ext jersey-spring4 2.26
Versi terbaru dari kebergantungan ini boleh didapati di jersey-container-servlet, jersey-media-json-jackson dan jersey-spring4.
3. Konfigurasi Web
Seterusnya, kita perlu membuat projek web untuk melakukan konfigurasi Servlet. Untuk ini, kami akan menggunakan WebApplicationInitializer Spring :
@Order(Ordered.HIGHEST_PRECEDENCE) public class ApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); servletContext.addListener(new ContextLoaderListener(context)); servletContext.setInitParameter( "contextConfigLocation", "com.baeldung.server"); } }
Di sini, kami menambahkan anotasi @Order (Ordered.HIGHEST_PRECEDENCE) untuk memastikan bahawa inisialisasi kami dilaksanakan sebelum pemula lalai Jersey-Spring.
4. Perkhidmatan Menggunakan Jersey JAX-RS
4.1. Kelas Perwakilan Sumber
Mari gunakan contoh kelas perwakilan sumber:
@XmlRootElement public class Employee { private int id; private String firstName; // standard getters and setters }
Perhatikan bahawa anotasi JAXB seperti @XmlRootElement hanya diperlukan jika sokongan XML diperlukan (selain JSON).
4.2. Pelaksanaan Perkhidmatan
Sekarang mari kita lihat bagaimana kita dapat menggunakan anotasi JAX-RS untuk membuat perkhidmatan web RESTful:
@Path("/employees") public class EmployeeResource { @Autowired private EmployeeRepository employeeRepository; @GET @Path("/{id}") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public Employee getEmployee(@PathParam("id") int id) { return employeeRepository.getEmployee(id); } @POST @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public Response addEmployee( Employee employee, @Context UriInfo uriInfo) { employeeRepository.addEmployee(new Employee(employee.getId(), employee.getFirstName(), employee.getLastName(), employee.getAge())); return Response.status(Response.Status.CREATED.getStatusCode()) .header( "Location", String.format("%s/%s",uriInfo.getAbsolutePath().toString(), employee.getId())).build(); } }
The @Path anotasi menyediakan jalan URI relatif kepada perkhidmatan. Kita juga dapat menyematkan pemboleh ubah dalam sintaks URI, seperti yang ditunjukkan oleh pemboleh ubah {id} . Kemudian, pemboleh ubah akan diganti pada waktu runtime. Untuk memperoleh, nilai pemboleh ubah kita boleh menggunakan anotasi @PathParam .
@GET , @PUT , @POST, @DELETE dan @HEAD menentukan kaedah permintaan HTTP , yang akan diproses dengan kaedah anotasi.
The @Produces anotasi mentakrifkan jenis sambutan titik akhir ini (MIME jenis media). Dalam contoh kami, kami telah mengkonfigurasinya untuk mengembalikan JSON atau XML bergantung pada nilai HTTP header Accept ( aplikasi / json atau aplikasi / xml ).
Sebaliknya, anotasi @Consumes menentukan jenis media MIME yang boleh digunakan oleh perkhidmatan. Dalam contoh kami, perkhidmatan boleh menggunakan JSON atau XML bergantung pada tajuk Kandungan HTTP ( aplikasi / json atau aplikasi / xml )
The @Context anotasi digunakan untuk maklumat menyuntik ke dalam bidang kelas, harta kacang atau kaedah parameter. Dalam contoh kami, kami menggunakannya untuk menyuntik UriInfo . Kita juga dapat menggunakannya untuk menyuntikkan ServletConfig , ServletContext , HttpServletRequest dan HttpServletResponse.
5. Menggunakan ExceptionMapper
ExceptionMapper membolehkan kita memintas pengecualian dan mengembalikan kod respons HTTP yang sesuai kepada pelanggan. Dalam contoh berikut, kod respons HTTP 404 dikembalikan jika pengecualian EmployeeNotFound dilemparkan:
@Provider public class NotFoundExceptionHandler implements ExceptionMapper { public Response toResponse(EmployeeNotFound ex) { return Response.status(Response.Status.NOT_FOUND).build(); } }
6. Menguruskan Kelas Sumber
Akhirnya, mari kita buat semua kelas pelaksanaan perkhidmatan dan pemetaan pengecualian terhadap jalan aplikasi:
@ApplicationPath("/resources") public class RestConfig extends Application { public Set
getClasses() { return new HashSet
( Arrays.asList( EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); } }
7. Ujian API
Sekarang mari kita menguji API dengan beberapa ujian langsung:
public class JerseyApiLiveTest { private static final String SERVICE_URL = "//localhost:8082/spring-jersey/resources/employees"; @Test public void givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess() throws ClientProtocolException, IOException { HttpUriRequest request = new HttpGet(SERVICE_URL); HttpResponse httpResponse = HttpClientBuilder .create() .build() .execute(request); assertEquals(httpResponse .getStatusLine() .getStatusCode(), HttpStatus.SC_OK); } }
8. Kesimpulannya
Dalam artikel ini, kami telah memperkenalkan kerangka Jersey dan mengembangkan API ringkas. Kami telah menggunakan ciri Spring for Dependency Injection. Kami juga telah melihat penggunaan ExceptionMapper .
Seperti biasa, kod sumber penuh terdapat dalam projek Github ini.
REST bawah