REST API עם ג'רזי ואביב
רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 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 תחתון