Java Jersey教程

时间:2020-02-23 14:35:20  来源:igfitidea点击:

欢迎使用Java Jersey教程。
最近,我开始使用JAX-RS Jersey框架从事Restful Web服务项目。

什么是Java Jersey框架?

Java Jersey项目跟踪JAX-RS API,该API用于在Java中创建Restful Web服务。

1.谁应该使用本教程?

本教程适用于对使用JAX-RS API和JAXB开发和部署Restful Web Services感兴趣的Java程序员。

2.前提条件

本教程的范围是使用Jersey API来创建Restful Web服务以及使用Java客户端程序调用Web服务以及使用该工具测试Web服务。

为了轻松理解本教程,需要对Java,Web服务,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氧气4.7.3

创建Jersey Eclipse Maven项目

在Eclipse中创建一个"动态Web项目",然后将其转换为maven项目。
这将为我们提供一个基于Maven的Web应用程序基础项目。

我已经将GroupId设置为com.theitroad.jersey,将artifactID设置为my-jersey-project,但是您可以指定任何您喜欢的名称。
一旦完成项目的开发,项目结构将如下图所示。

Java Jersey Restful Web服务项目说明

  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.theitroad.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>
  1. EmpRequest.java:请求对象的Java Bean。
    这里要注意的重要一点是@XmlRootElement注释,用于将类映射到XML元素。
package com.theitroad.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;
	}
}
  1. EmpResponse.java:响应对象的Java bean。
package com.theitroad.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;
	}

}
  1. ErrorResponse.java:在发生异常的情况下将作为响应发送的Java Bean。
package com.theitroad.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;
	}

}
  1. EmpNotFoundException.java:Web服务中引发的普通异常类。
package com.theitroad.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);
	}
}
  1. web.xml:Web服务的部署描述符。
    因此,任何带有URIhttps://&lt;HOST>:&lt;PORT>/My-Jersey-Project/rest/*的请求都将由Jersey ServletContainer servlet处理。

为" com.sun.jersey.config.property.packages"传递的init-param值定义了jersey将其中查找Web服务类的软件包。
此属性必须指向您的资源类。
它还在子包中查找资源类。

<?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.theitroad</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>
  1. EmpRouter.java:处理不同类型请求的资源类。
  • @Path("/emp")–所有带有URI"https://<HOST>:<PORT>/My-Jersey-Project/rest/emp /的请求都将由该资源类处理。

  • @Path("/getEmp")–使用URI"https://<HOST>:<PORT>/My-Jersey-Project/rest/emp/getEmp的所有请求都将通过此方法处理。

  • @POST –此注释定义所使用的HTTP方法应为POST。
    其他一些可能的值是@ GET,@ PUT,@ DELETE

  • @Consumes(MediaType.APPLICATION_XML)–该方法接受XML元素

  • @Produces(MediaType.APPLICATION_XML)–该方法返回XML元素

package com.theitroad.router;

import com.theitroad.exception.EmpNotFoundException;
import com.theitroad.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();
	}
}
  1. EmpNotFoundExceptionMapper.java:异常Mapper类,它将EmpNotFoundException映射到Response对象。
    该类应具有@Provider批注。
    此类应位于web.xml中为资源类提供的包中。
    toResponse()方法的实现会生成ErrorResponse对象,并将其设置为Response对象中的Entity,状态为INTERNAL_SERVER_ERROR。
package com.theitroad.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.theitroad.exception.EmpNotFoundException;
import com.theitroad.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();

	}

}

我们的Web服务已准备就绪,只需构建它即可创建WAR文件并将其部署到应用程序服务器。

Jersey客户端示例

我们可以使用Jersey客户端来调用我们的Web服务并以编程方式获得响应。

EmpClient.java:这是一个示例Java程序,通过它可以调用我们的Web服务。
我们正在使用Jersey客户端API调用服务,并根据响应状态将响应实体解析为EmpResponse或者ErrorResponse类。

package com.theitroad.client;

import javax.ws.rs.core.MediaType;

import com.theitroad.model.EmpRequest;
import com.theitroad.model.EmpResponse;
import com.theitroad.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();
		//set id as 1 for OK response
		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());
		}
	}

}