دورة تعليمية لجافا في جيرسي

مرحبًا بك في درس جافا جيرسي. بدأت مؤخرًا في العمل على مشروع خدمة ويب ريستفل باستخدام إطار JAX-RS Jersey.

ما هو إطار جافا جيرسي؟

يتتبع مشروع جافا جيرسي واجهة برمجة التطبيقات JAX-RS، والتي تستخدم لإنشاء خدمات الويب ريستفل في جافا.

1. من يجب أن يستخدم هذا البرنامج التعليمي؟

يهدف هذا البرنامج التعليمي إلى مبرمجي جافا الذين يهتمون بتطوير ونشر خدمات الويب ريستفل باستخدام واجهة برمجة التطبيقات JAX-RS وJAXB.

2. الشروط المسبقة

يتناول هذا البرنامج التعليمي استخدام واجهة برمجة التطبيقات جيرسي لإنشاء خدمات الويب ريستفل واستدعاء خدمة الويب باستخدام برنامج عميل جافا واختبار خدمة الويب باستخدام الأداة. يتطلب فهم أساسي لجافا وخدمات الويب وXML وMaven وأي خادم تطبيق (JBoss/Tomcat) لفهم البرنامج التعليمي بسهولة.

3. البرمجيات والأدوات

  • إصدار JDK 1.8.0_131
  • Apache Maven 3.5.3
  • نظام التشغيل Mac OS X 10.13.4
  • Tomcat 8.5.16
  • Eclipse Java EE IDE Oxygen 4.7.3

إنشاء مشروع Jersey Eclipse Maven

قم بإنشاء “مشروع ويب ديناميكي” في Eclipse ثم قم بتحويله إلى مشروع Maven. سيوفر لنا هذا مشروعًا أساسيًا لتطبيق الويب الذي يعتمد على Maven. قمت بتحديد GroupId كـ com.journaldev.jersey و artifactID كـ my-jersey-project ولكن يمكنك تحديد أي شيء تفضله. بمجرد الانتهاء من تطوير المشروع، ستبدو هيكلة المشروع كما في الصورة أدناه.

شرح مشروع خدمة الويب القائم على Jersey Restful في Java

1. pom.xml: تفاصيل تكوين المشروع، لاحظ توفير الاعتمادات jersey، التفاصيل الأخرى مشتركة لأي مشروع Maven مماثل.

<project xmlns="https://maven.apache.org/POM/4.0.0"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.journaldev.jersey</groupId>
	<artifactId>my-jersey-project</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<dependencies>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-server</artifactId>
			<version>1.14</version>
		</dependency>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-servlet</artifactId>
			<version>1.14</version>
		</dependency>
		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-client</artifactId>
			<version>1.14</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>My-Jersey-Project</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.7.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.0.0</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

2. EmpRequest.java: جافا بين لكائن الطلب. الشيء المهم هنا هو التعليق @XmlRootElement لتعيين الصف كعنصر XML.

package com.journaldev.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "empRequest")
public class EmpRequest {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

3. EmpResponse.java: جافا بين لكائن الاستجابة.

package com.journaldev.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "empResponse")
public class EmpResponse {
	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

4. ErrorResponse.java: جافا بين الذي سيتم إرساله كاستجابة في حالة حدوث استثناء.

package com.journaldev.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "errorResponse")
public class ErrorResponse {

	private String errorCode;
	private int errorId;

	public String getErrorCode() {
		return errorCode;
	}

	public void setErrorCode(String errorCode) {
		this.errorCode = errorCode;
	}

	public int getErrorId() {
		return errorId;
	}

	public void setErrorId(int errorId) {
		this.errorId = errorId;
	}

}

5. EmpNotFoundException.java: فئة استثناء عادية يتم رميها في خدمة الويب.

package com.journaldev.exception;

public class EmpNotFoundException extends Exception {

	private static final long serialVersionUID = 4351720088030656859L;
	private int errorId;

	public int getErrorId() {
		return errorId;
	}

	public EmpNotFoundException(String msg, int errorId) {
		super(msg);
		this.errorId = errorId;
	}

	public EmpNotFoundException(String msg, Throwable cause) {
		super(msg, cause);
	}
}

6. web.xml: وصف النشر لخدمة الويب. لذا سيتم معالجة أي طلب بعنوان URI https://<HOST>:<PORT>/My-Jersey-Project/rest/* بواسطة خدمة Jersey ServletContainer servlet. قيمة init-param الممررة لـ “com.sun.jersey.config.property.packages” تعرف الحزمة التي سيبحث فيها jersey عن فئات خدمة الويب. يجب أن تشير هذه الخاصية إلى فئات الموارد الخاصة بك. كما أنه يبحث عن فئات الموارد في الحزم الفرعية.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xmlns="https://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>My Jersey Project</display-name>

	<!-- Jersey Servlet configurations -->
	<servlet>
		<servlet-name>Jersey REST Service</servlet-name>
		<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>com.sun.jersey.config.property.packages</param-name>
			<param-value>com.journaldev</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Jersey REST Service</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>
	<!-- Jersey Servlet configurations -->

</web-app>

7. EmpRouter.java: فئة المورد التي تتعامل مع أنواع مختلفة من الطلبات.

  • @Path(“/emp”) – سيتم معالجة جميع الطلبات بعنوان URI https://<HOST>:<PORT>/My-Jersey-Project/rest/emp/ بواسطة فئة المورد هذه.
  • @مسار(“/getEmp”) – سيتم معالجة جميع الطلبات ذات الـ URI https://<HOST>:<PORT>/My-Jersey-Project/rest/emp/getEmp بهذه الطريقة.
  • @POST – تعريف هذه التعليقات يحدد أن طريقة HTTP المستخدمة يجب أن تكون POST. بعض القيم الأخرى الممكنة هي @GET, @PUT, @DELETE
  • @تستهلك(MediaType.APPLICATION_XML) – الطريقة تقبل عنصر XML
  • @ينتج(MediaType.APPLICATION_XML) – الطريقة تعيد عنصر XML
package com.journaldev.router;

import com.journaldev.exception.EmpNotFoundException;
import com.journaldev.model.*;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBElement;

@Path("/emp")
public class EmpRouter {

	@POST
	@Path("/getEmp")
	@Consumes(MediaType.APPLICATION_XML)
	@Produces(MediaType.APPLICATION_XML)
	public Response getEmp(JAXBElement<EmpRequest> empRequest)
			throws EmpNotFoundException {
		EmpResponse empResponse = new EmpResponse();
		if (empRequest.getValue().getId() == 1) {
			empResponse.setId(empRequest.getValue().getId());
			empResponse.setName(empRequest.getValue().getName());
		} else {
			throw new EmpNotFoundException("Wrong ID", empRequest.getValue()
					.getId());
		}
		return Response.ok(empResponse).build();
	}
}

8. EmpNotFoundExceptionMapper.java: فئة محول الاستثناء التي تخطط للانتقال من استثناء EmpNotFoundException إلى كائن Response. يجب أن تحتوي الفئة على تعليق @مزود. يجب أن تكون هذه الفئة في الحزمة المقدمة لفئات الموارد في web.xml. تنفيذ طريقة toResponse() يولد كائن ErrorResponse ويضبطه ككيان في كائن Response بحالة INTERNAL_SERVER_ERROR.

package com.journaldev.exceptionmapper;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import com.journaldev.exception.EmpNotFoundException;
import com.journaldev.model.ErrorResponse;

@Provider
public class EmpNotFoundExceptionMapper implements
		ExceptionMapper<EmpNotFoundException> {

	public EmpNotFoundExceptionMapper() {
	}
	
	public Response toResponse(
			EmpNotFoundException empNotFoundException) {
		ErrorResponse errorResponse = new ErrorResponse();
		errorResponse.setErrorId(empNotFoundException.getErrorId());
		errorResponse.setErrorCode(empNotFoundException.getMessage());
		return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
				errorResponse).type(
				MediaType.APPLICATION_XML).build();

	}

}

خدمة الويب الخاصة بنا جاهزة، قم فقط ببنائها لإنشاء ملف WAR ونشره على خادم التطبيقات.

مثال Jersey Client

يمكننا استخدام Jersey Client لاستدعاء خدمة الويب الخاصة بنا والحصول على استجابة برمجيًا. EmpClient.java: هذا هو برنامج Java عينة من خلاله نقوم باستدعاء خدمة الويب الخاصة بنا. نحن نستخدم Jersey Client API لاستدعاء الخدمة وبناءً على حالة الاستجابة نقوم بتحليل كيان الاستجابة إلى فئة EmpResponse أو ErrorResponse.

package com.journaldev.client;

import javax.ws.rs.core.MediaType;

import com.journaldev.model.EmpRequest;
import com.journaldev.model.EmpResponse;
import com.journaldev.model.ErrorResponse;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class EmpClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String uri = "https://localhost:8080/My-Jersey-Project/rest/emp/getEmp";
		EmpRequest request = new EmpRequest();
		// قم بتعيين المعرف إلى 1 للاستجابة الصحيحة
		request.setId(2);
		request.setName("PK");
		try {
			Client client = Client.create();
			WebResource r = client.resource(uri);
			ClientResponse response = r.type(MediaType.APPLICATION_XML).post(ClientResponse.class, request);
			System.out.println(response.getStatus());
			if (response.getStatus() == 200) {
				EmpResponse empResponse = response.getEntity(EmpResponse.class);
				System.out.println(empResponse.getId() + "::" + empResponse.getName());
			} else {
				ErrorResponse exc = response.getEntity(ErrorResponse.class);
				System.out.println(exc.getErrorCode());
				System.out.println(exc.getErrorId());
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

}

استجابة ناجحة استجابة خطأ

ملخص

في هذه المقالة، تعلمنا كيفية إنشاء خدمة ويب REST باستخدام واجهة برمجة تطبيقات Jersey. كما نظرنا في Jersey Client لاستدعاء واجهات برمجة التطبيقات REST الخاصة بنا من خلال برنامج Java.

يمكنك مراجعة كود المشروع الكامل من مستودع GitHub الخاص بنا.

Source:
https://www.digitalocean.com/community/tutorials/jersey-java-tutorial