REST API עם ג'רזי ואביב

REST למעלה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. סקירה כללית

ג'רזי היא מסגרת קוד פתוח לפיתוח שירותי אינטרנט RESTful. הוא משמש כמימוש התייחסות של JAX-RS.

במאמר זה, נחקור את יצירת שירות האינטרנט RESTful באמצעות ג'רזי 2. כמו כן, נשתמש בזריקת התלות של Spring (DI) עם תצורת Java.

2. תלות Maven

נתחיל בהוספת תלות ל- pom.xml:

 org.glassfish.jersey.containers ג 'רזי-מיכל-סרבל 2.26 org.glassfish.jersey.media ג' רזי-מדיה-json-jackson 2.26 

כמו כן, לצורך שילוב האביב עלינו להוסיף את ה- ג 'רזי-קפיץ 4 תלות:

 org.glassfish.jersey.ext jersey-spring4 2.26 

הגרסה האחרונה של תלות אלה זמינה ב- jersey-container-servlet, jersey-media-json-jackson ו- jersey-spring4.

3. תצורת רשת

לאחר מכן, עלינו להקים פרויקט אינטרנט לביצוע תצורת Servlet. לשם כך נשתמש באביב WebApplicationInitializer:

@Order (Ordered.HIGHEST_PRECEDENCE) מחלקה ציבורית ApplicationInitializer מיישם את WebApplicationInitializer {@Override public void onStartup (ServletContext servletContext) זורק ServletException {AnnotationConfigWebApplicationContext context = AnnotationConfigWebApplicationContextContext; servletContext.addListener (ContextLoaderListener חדש (הקשר)); servletContext.setInitParameter ("contextConfigLocation", "com.baeldung.server"); }}

הנה, אנו מוסיפים את הזמנה @ (הורה. HIGHEST_PRECEDENCE) ביאור כדי להבטיח שמאתחל שלנו יבוצע לפני אתחול ברירת המחדל של ג'רזי-ספרינג.

4. שירות המשתמש בג'רזי JAX-RS

4.1. כיתת ייצוג משאבים

בואו להשתמש בכיתת ייצוג משאבים לדוגמה:

עובד בכיתה ציבורית @XmlRootElement {מזהה פרטי פרטי; פרטי מחרוזת firstName; // סטרים וקובעים סטנדרטיים}

שים לב שהערות JAXB כמו @XmlRootElement נדרשים רק אם יש צורך בתמיכה ב- XML ​​(בנוסף ל- JSON).

4.2. יישום שירות

בואו נסתכל כיצד אנו יכולים להשתמש בהערות JAX-RS כדי ליצור שירותי אינטרנט RESTful:

@Path ("/ עובדים") שכבה ציבורית EmployeeResource {@Autowired Private EmployerRepository employeeRepository; @GET @Path ("/ {id}") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) עובד ציבורי getEm Employee (@PathParam ("id") מזהה int) {החזר עובדRepository.getEmployee (id); } @ POST @ Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) תגובה ציבורית addEm עובד (עובד שכיר, @Context UriInfo uriInfo) {עובדRepository.addEm עובד (עובד חדש (עובד. GetId (), עובד. GetFirstName (), עובד. getLastName (), employee.getAge ())); החזר Response.status (Response.Status.CREATED.getStatusCode ()) .header ("מיקום", String.format ("% s /% s", uriInfo.getAbsolutePath (). toString (), עובד.getId ()) ).לִבנוֹת(); }}

ה @נָתִיב ביאור מספק את נתיב ה- URI היחסי לשירות. אנו יכולים גם להטמיע משתנים בתחביר ה- URI, כמו ה- {תְעוּדַת זֶהוּת} מראה משתנה. לאחר מכן, המשתנים יוחלפו בזמן הריצה. כדי להשיג, את ערך המשתנה אנו יכולים להשתמש ב- @ PathParam ביאור.

@לקבל, @לָשִׂים, @הודעה, @לִמְחוֹק ו @רֹאשׁ הגדר את שיטת ה- HTTP של הבקשה, אשר יעובדו בשיטות ביאור.

ה @Produces ביאור מגדיר את סוג התגובה של נקודת הקצה (סוג מדיה MIME). בדוגמה שלנו, הגדרנו אותו להחזרת JSON או XML בהתאם לערך כותרת HTTP לְקַבֵּל (יישום / json אוֹ יישום / xml).

מצד שני, את @Consumes ביאור מגדיר את סוגי המדיה MIME שהשירות יכול לצרוך. בדוגמה שלנו, השירות יכול לצרוך JSON או XML בהתאם לכותרת ה- HTTP סוג תוכן (יישום / json אוֹ יישום / xml).

ה @הֶקשֵׁר ביאור משמש להזרקת מידע לשדה מחלקה, תכונה שעועית או פרמטר. בדוגמה שלנו, אנו משתמשים בה להזרקה UriInfo. אנחנו יכולים להשתמש בו גם להזרקה ServletConfig, ServletContext, HttpServletRequest ו HttpServletResponse.

5. שימוש ExceptionMapper

ExceptionMapper מאפשר לנו ליירט את החריגים ולהחזיר ללקוח קוד תגובת HTTP מתאים. בדוגמה הבאה, קוד תגובת HTTP 404 מוחזר אם עובד לא נמצא יוצא מן הכלל:

@Provider מחלקה ציבורית NotFoundExceptionHandler מיישם את ExceptionMapper {Public Response toResponse (EmployeeNotFound ex) {return Response.status (Response.Status.NOT_FOUND) .build (); }}

6. ניהול שיעורי משאבים

סוף כל סוף, בואו נחבר את כל שיעורי יישום השירות ומפות החריגים לנתיב יישום:

@ApplicationPath ("/ resources") מחלקה ציבורית RestConfig מרחיבה את היישום {סט קבוצה ציבורית getClasses () {החזר HashSet חדש(Arrays.asList (EmployeeResource.class, NotFoundExceptionHandler.class, AlreadyExistsExceptionHandler.class)); }}

7. בדיקת API

בואו נבדוק כעת את ממשקי ה- API עם כמה מבחנים חיים:

מחלקה ציבורית JerseyApiLiveTest {גמר סטטי פרטי פרטי מחרוזת SERVICE_URL = "// localhost: 8082 / spring-jersey / resources / workers"; @Test הציבור בטל givenGetAllEmployees_whenCorrectRequest_thenResponseCodeSuccess () זורק ClientProtocolException, IOException {HttpUriRequest בקשה = HttpGet חדש (SERVICE_URL); HttpResponse httpResponse = HttpClientBuilder .create () .build () .execute (בקשה); assertEquals (httpResponse .getStatusLine () .getStatusCode (), HttpStatus.SC_OK); }}

8. מסקנה

במאמר זה הצגנו את מסגרת ג'רזי ופיתחנו ממשק API פשוט. השתמשנו באביב לתכונות של הזרקת תלות. ראינו גם את השימוש ב ExceptionMapper.

כמו תמיד, קוד המקור המלא זמין בפרויקט Github זה.

REST תחתון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס