웹사이트 검색

저지 자바 튜토리얼


Java Jersey 자습서에 오신 것을 환영합니다. 최근에 저는 JAX-RS Jersey 프레임워크를 사용하여 Restful 웹 서비스 프로젝트 작업을 시작했습니다.

Java Jersey 프레임워크란 무엇입니까?

1. 누가 이 튜토리얼을 사용해야 합니까?

이 튜토리얼은 JAX-RS API 및 JAXB를 사용하여 Restful Web Services를 개발하고 배포하는 데 관심이 있는 Java 프로그래머를 대상으로 합니다.

2. 전제 조건

이 튜토리얼의 범위는 Restful 웹 서비스를 생성하고 Java 클라이언트 프로그램을 사용하여 웹 서비스를 호출하고 도구를 사용하여 웹 서비스를 테스트하기 위해 Jersey API를 사용하는 것입니다. 자습서를 쉽게 이해하려면 Java, 웹 서비스, XML, Maven 및 모든 응용 프로그램 서버(JBoss/Tomcat)에 대한 기본적인 이해가 필요합니다.

3. 소프트웨어 및 도구

  • JDK 버전 1.8.0_131
  • 아파치 메이븐 3.5.3
  • 맥 OS X 10.13.4
  • 톰캣 8.5.16
  • Eclipse 자바 EE IDE 산소 4.7.3

Jersey Eclipse Maven 프로젝트 생성

Java Jersey Restful 웹 서비스 프로젝트 설명

1. pom.xml: 프로젝트 구성 세부 정보, 제공된 저지 종속성에 유의하십시오. 기타 세부 정보는 유사한 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: 요청 개체용 Java Bean. 여기서 주목해야 할 중요한 사항은 클래스를 XML 요소에 매핑하는 @XmlRootElement 주석입니다.

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: 응답 개체에 대한 Java bean입니다.

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: 예외 발생 시 응답으로 보낼 Java Bean.

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://:/My-Jersey-Project/rest/*인 모든 요청은 Jersey ServletContainer 서블릿에서 처리됩니다. "com.sun.jersey.config.property.packages\에 전달된 init-param 값은 패키지 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://:/My-Jersey-Project/rest/emp/인 모든 요청이 처리됩니다. 이 리소스 클래스별로.
  • @Path(\/getEmp”) - URI가 https://:/My-Jersey-Project/rest/emp/getEmp인 모든 요청은 이 방법으로 처리됩니다.
  • @DELETE
  • @Consumes(MediaType.APPLICATION_XML) - 메서드는 XML 요소를 허용합니다.
  • @Produces(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 객체에 매핑하는 Exception Mapper 클래스입니다. 클래스에는 @Provider 주석이 있어야 합니다. 이 클래스는 web.xml의 리소스 클래스에 대해 제공된 패키지에 있어야 합니다. toResponse() 메서드의 구현은 ErrorResponse 객체를 생성하고 이를 INTERNAL_SERVER_ERROR 상태의 Response 객체에서 엔터티로 설정합니다.

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 클라이언트를 사용하여 웹 서비스를 호출하고 프로그래밍 방식으로 응답을 받을 수 있습니다. EmpClient.java: 웹 서비스를 호출하는 샘플 Java 프로그램입니다. Jersey 클라이언트 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();
		// 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());
		}
	}

}

요약

이번 포스팅에서는 Jersey API를 이용하여 REST 웹 서비스를 생성하는 방법에 대해 알아보았습니다. 또한 Java 프로그램을 통해 REST API를 호출하기 위해 Jersey 클라이언트를 조사했습니다.

GitHub 리포지토리에서 전체 프로젝트 코드를 체크아웃할 수 있습니다.