临沂建设质量监督站网站,百度公司推广电话,青岛市建设监理协会网站,wordpress 修改仪表盘最近#xff0c;我开始使用Jersey API开发一个Restful Web服务项目。 在线提供了一些教程#xff0c;但是我遇到了异常处理方面的一些问题#xff0c;而且在使用JaxB和提供异常处理方法的完整项目中找不到任何地方。 因此#xff0c;一旦我能够使用带有异常处理和客户端程序… 最近我开始使用Jersey API开发一个Restful Web服务项目。 在线提供了一些教程但是我遇到了异常处理方面的一些问题而且在使用JaxB和提供异常处理方法的完整项目中找不到任何地方。 因此一旦我能够使用带有异常处理和客户端程序的Jersey API创建一个Restful Web服务我决定编写本教程来帮助每个人都开始使用Jersey。 谁应该使用本教程 本教程适用于对使用Jersey API和JaxB开发和部署Restful Web Services感兴趣的Java程序员。 先决条件 本教程的范围是使用Jersey API来创建Restful Web服务以及使用Java客户端程序调用Web服务以及使用工具测试Web服务。 为了轻松理解本教程需要对JavaWeb服务XMLMaven和任何应用程序服务器JBoss / Tomcat有基本的了解。 使用的软件和工具 JDK版本1.6.0_37 Apache Maven 3.0.3 Mac OS X 10.8.2 JBoss 4.2.2您可以使用任何应用程序服务器例如TomcatGlassfish等 Eclipse Indigo任何支持Maven的Java IDE 在Eclipse和Jersey中创建Maven项目 在Eclipse中创建一个Maven项目它将为您提供基本的项目结构。 我已经将GroupId设置为“ JD”将artifactID设置为“ my-jersey-project”但是您可以提供任何您喜欢的东西。 一旦完成项目的开发图像将如下图所示。 Jersey Web服务项目说明 pom.xml 项目配置详细信息请注意提供的jersey依赖项其他详细信息对于任何Maven项目都是通用的。 project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdJD/groupIdartifactIdmy-jersey-project/artifactIdversion0.0.1-SNAPSHOT/versionpackagingwar/packagingdependenciesdependencygroupIdcom.sun.jersey/groupIdartifactIdjersey-server/artifactIdversion1.14/version/dependencydependencygroupIdcom.sun.jersey/groupIdartifactIdjersey-servlet/artifactIdversion1.14/version/dependencydependencygroupIdcom.sun.jersey/groupIdartifactIdjersey-client/artifactIdversion1.14/version/dependency/dependenciesbuildfinalName${artifactId}-${version}/finalNamepluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationsource1.6/sourcetarget1.6/target/configuration/pluginpluginartifactIdmaven-war-plugin/artifactIdversion2.1-alpha-2/versionconfigurationpackagingExcludesWEB-INF/lib/servlet-api-*.jar/packagingExcludes/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-dependency-plugin/artifactIdversion2.0/versionexecutionsexecutionidunpack/idphaseinstall/phasegoalsgoalunpack/goal/goalsconfigurationartifactItemsartifactItemgroupId${groupId}/groupIdartifactId${artifactId}/artifactIdversion${version}/versiontype${packaging}/typeoverWritetrue/overWriteoutputDirectory${project.build.directory}/${artifactId}-${version}-exploded.${packaging}/outputDirectory/artifactItem/artifactItems/configuration/execution/executions/plugin/plugins/build
/project EmpRequest.java 请求对象的Java Bean。 这里要注意的重要事情是XmlRootElement批注用于将类映射到XML元素。 package com.jd.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;}
} EmpResponse.java 响应对象的Java bean。 package com.jd.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;}} ErrorResponse.java 在发生异常的情况下将作为响应发送的Java Bean。 package com.jd.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;}} EmpNotFoundException.javaWeb服务中引发的普通异常类。 package com.jd.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);}
} jboss-web.xml 为Web服务定义JBoss servlet上下文。 jboss-webcontext-rootjd/context-root
/jboss-web web.xml Web服务的部署描述符。 因此任何带有URI“ http// HOSTPOST / jd / rest / *”的请求都将由Jersey ServletContainer servlet处理。 要注意的重要事项是为“ com.sun.jersey.config.property.packages”传递的init-param值。 这定义了jersey将在哪个程序包中查找Web服务类。 此属性必须指向您的资源类。 它还在子包中查找资源类。 ?xml version1.0 encodingUTF-8?
web-app idWebApp_ID version2.5xmlnshttp://java.sun.com/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsddisplay-nameMy Jersey Project/display-name!-- Jersey Servlet configurations --servletservlet-nameJersey REST Service/servlet-nameservlet-classcom.sun.jersey.spi.container.servlet.ServletContainer/servlet-classinit-paramparam-namecom.sun.jersey.config.property.packages/param-nameparam-valuecom.jd/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-nameJersey REST Service/servlet-nameurl-pattern/rest/*/url-pattern/servlet-mapping!-- Jersey Servlet configurations --/web-app EmpRouter.java 处理不同类型请求的资源类。 Path“ / emp”–具有URI http// HOSTPORT / jd / rest / emp /的所有请求将由该资源类处理。 Path“ / getEmp”–使用URI http// HOSTPORT / jd / rest / emp / getEmp的所有请求都将通过此方法处理。 POST –此注释定义所使用的HTTP方法应为POST。 其他一些可能的值是 GET PUT DELETE ConsumesMediaType.APPLICATION_XML–该方法接受XML元素 ProducesMediaType.APPLICATION_XML–该方法返回XML元素 package com.jd.router;import com.jd.exception.EmpNotFoundException;
import com.jd.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 {POSTPath(/getEmp)Consumes(MediaType.APPLICATION_XML)Produces(MediaType.APPLICATION_XML)public Response getEmp(JAXBElementEmpRequest 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();}
} EmpNotFoundExceptionMapper.java 异常Mapper类将EmpNotFoundException映射到Response对象。 该类应具有批注Provider。 此类应位于web.xml中为资源类提供的包中。 toResponse方法的实现会生成ErrorResponse对象并将其设置为Response对象中的Entity状态为INTERNAL_SERVER_ERROR。 package com.jd.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.jd.exception.EmpNotFoundException;
import com.jd.model.ErrorResponse;Provider
public class EmpNotFoundExceptionMapper implementsExceptionMapperEmpNotFoundException {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文件并将其部署在应用程序服务器中。 EmpClient.java 这是一个示例Java程序通过它可以调用我们的Web服务。 我们正在使用jersey客户端API调用服务并基于响应状态将响应实体解析为EmpResponse或ErrorResponse类。 package com.jd.client;import javax.ws.rs.core.MediaType;import com.jd.model.EmpRequest;
import com.jd.model.EmpResponse;
import com.jd.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 http://localhost:8080/jd/rest/emp/getEmp;EmpRequest request new EmpRequest();//set id as 1 for OK responserequest.setId(2);request.setName(PK);try{Client client Client.create();WebResource rclient.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编写并编写您的第一个Restful Web服务。 如果您遇到任何问题或需要进一步的说明请告诉我。 参考 休息使用Jersey – 开发人员食谱博客上的JCG合作伙伴 Pankaj Kumar 提供的JAXB异常处理和客户端程序的完整教程 。 翻译自: https://www.javacodegeeks.com/2012/10/rest-using-jersey-complete-tutorial-with-jaxb-exception-handling-and-client-program.html