java_Jersey框架的统一异常处理惩罚机制阐明,一、配景 写这边文章源于有
读到这里,错误出自Dao层,我们可以这样会见这个资源:提倡GET请求。
示例项目不回收Maven机制 示例的业务场景说明: 1、我们通过读取一个properties设置文件,数据耐久层,它常常呈现!我们会发明这类异常并不需要在代码里用try...catch...去捕捉它。
我们就从异常名字上直接开端判定出,可以通报一个查询参数n,不需要的则是unchecked exception, 8、errMsg.properties用于界说异常信息, 留意:我们利用@Autowired注入了TestDao类, Object[] values) {super(code,通过通报参数的方法,用于对系统抛出的错误key举办国际化转换,checked exception是如何转化为我们本身界说个unchecked exception,需要try...catch...的异常是checked exception,@Autowired是Spring提供的一个注解;我们必需提供一个要注解属性的Set要领,我们抛出了一个本身的业务异常, null,我说句话我是有前提的,但要留意不要丢失掉异常仓库(这一点是初学者容易犯的一个错误),其时我对其的答复是:我IT之家时仅用RuntimeException。
它是jersey-srping集成包的一个注解;我们必需提供一个要注解属性的Set要领," + proper.getProperty("key2");}} 在该类中, String code) {super(code,我认为那只算是一种简朴懒惰的处理惩罚方法吧!那什么样的处理惩罚方法算是高超的, 2、业务层面的开拓,我们的处理惩罚方法是:a、记录异常日志;b、向客户端抛一个尺度的http尺度错误状态码和错误动静,措施架构设计者也该当只管统一的处理惩罚异常;假如不做统一处理惩罚, ExceptionCode.READ_CONFIG_FAILED);} finally {if (is != null) {try {is.close();is = null;} catch (IOException e) {throw new DaoException(e,导入eclipse后,来看一下: read.file.failed=读取文件失败read.config.failed=读取设置项失败must.be.less.than.10=参数必需小于10colse.file.failed=封锁文件失败request.not.found=没有找到相应的处事internal.server.error=处事器内部错误 三、陈设及测试 你可以在本文附件里下载到源码。
不再需要try...catch... 3、业务实现类:TestService.java package com.iteye.redhacker.jersey.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.iteye.redhacker.jersey.dao.TestDao;import com.iteye.redhacker.jersey.exception.ExceptionCode;import com.iteye.redhacker.jersey.exception.ServiceException;@Componentpublic class TestService {@Autowiredprivate TestDao testDao;public String sayHello(int n) {// 业务上划定n不能大于10if (n 10) {throw new ServiceException(ExceptionCode.MUST_BE_LESS_THAN_10);}return testDao.sayHello();}/** * @param testDao the testDao to set */public void setTestDao(TestDao testDao) {this.testDao = testDao;}} 在该类中, 6、自界说异常基类:BaseException.java package com.iteye.redhacker.jersey.exception;/** * 异常基类, 5、统一异常处理惩罚器类:ExceptionMapperSupport.java package com.iteye.redhacker.jersey.jaxrs;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.ws.rs.core.Context;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import javax.ws.rs.core.Response.Status;import javax.ws.rs.ext.ExceptionMapper;import javax.ws.rs.ext.Provider;import org.apache.log4j.Logger;import org.springframework.web.context.WebApplicationContext;import com.iteye.redhacker.jersey.exception.BaseException;import com.iteye.redhacker.jersey.exception.ExceptionCode;import com.sun.jersey.api.NotFoundException;/** * 统一异常处理惩罚器 */@Providerpublic class ExceptionMapperSupport implements ExceptionMapperException {private static final Logger LOGGER = Logger.getLogger(ExceptionMapperSupport.class);private static final String CONTEXT_ATTRIBUTE = WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;@Contextprivate HttpServletRequest request;@Contextprivate ServletContext servletContext;/** * 异常处理惩罚 ** @param exception * @return 异常处理惩罚后的Response工具 */public Response toResponse(Exception exception) {String message = ExceptionCode.INTERNAL_SERVER_ERROR;Status statusCode = Status.INTERNAL_SERVER_ERROR;WebApplicationContext context = (WebApplicationContext) servletContext.getAttribute(CONTEXT_ATTRIBUTE);// 处理惩罚unchecked exceptionif (exception instanceof BaseException) {BaseException baseException = (BaseException) exception;String code = baseException.getCode();Object[] args = baseException.getValues();message = context.getMessage(code,还可以在log中看到如下异常错误: [2013-08-15 00:25:55] [ERROR] 参数必需小于10com.iteye.redhacker.jersey.exception.ServiceException: must.be.less.than.10at com.iteye.redhacker.jersey.service.TestService.sayHello(TestService.java:20)at com.iteye.redhacker.jersey.delegate.TestResources.sayHello(TestResources.java:21)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1483)at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1414)at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353) 关于其他的一些测试,一个不需要处理惩罚。
在我们进修IO类和JDBCIT之家的时候, String code。
当抛出这个异常时,重要的是我们怎么去处理惩罚这些异常,在web项目开拓来讲。
Throwable cause,确切的应该这么说:在成熟的开拓框架下编写业务代码,以便后续的措施呈现妨碍时举办错误排查,request.getLocale());} else if (exception instanceof NotFoundException) {message = ExceptionCode.REQUEST_NOT_FOUND;statusCode = Status.NOT_FOUND;}// checked exception和unchecked exception均被记录在日志里LOGGER.error(message,各人可以去实验一下,只要将你的tomcat/config/server.xml里插手: Host...Context path="/a" reloadable="true" docBase="D:/workspace/test/JerseyExceptionMapperTest/web" //Host 启动tomcat就可以了! 做两个测试: 1、 2、 第1个测试,设置文件的内容为: key1=hello key2=iteye.com 2、提倡一个:8888/a/resources/testn=11的GET请求,那e.printStackTrace()算不算处理惩罚了异常, 我的概念是(Web系统开拓): 1、在框架层面封装checked exception,说说个中的统一异常处理惩罚,使得措施可以或许继承执行下去, 4、其他如业务层, 2、数据会见类:TestDao.java package com.iteye.redhacker.jersey.dao;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.util.Properties;import org.springframework.stereotype.Component;import com.iteye.redhacker.jersey.exception.DaoException;import com.iteye.redhacker.jersey.exception.ExceptionCode;@Componentpublic class TestDao {public String sayHello() {ClassLoader classLoader = TestDao.class.getClassLoader();String iniFile = "com/iteye/redhacker/jersey/dao/test.properties";URL url = classLoader.getResource(iniFile);InputStream is;try {is = url.openStream();} catch (IOException e) {throw new DaoException(e,当找不到要读取的文件时,我认为如何给出谜底并不重要, MediaType.TEXT_PLAIN).status(statusCode).build();}} 在这个类内里我们处理惩罚了我们界说的unchecked exception异常,复用错误信息: 第{0}个{1}参数错误 7、其他异常根基差不多, null, 2、假如长短web项目,这种重复反复的try...catch会让我们对java的异常影象深刻!初学者往往不清楚java的异常为什么会设计成这个样子, values);}private static final long serialVersionUID = -3711290613973933714L;} 它担任了BaseException。
exception);return Response.ok(message, cause);this.code = code;this.values = values; }} 这个类界说了项目异常类的根基模板, 写这边文章源于有伴侣问过java中的checked exception和unchecked exception有啥区别,各个模块的运行期异常均担任与该类 */public class BaseException extends RuntimeException {/*** the serialVersionUID*/ private static final long serialVersionUID = 1381325479896057076L;/*** message key*/ private String code;/*** message params*/ private Object[] values;/*** @return the code*/ public String getCode() {return code; }/*** @param code the code to set*/ public void setCode(String code) {this.code = code; }/*** @return the values*/ public Object[] getValues() {return values; }/*** @param values the values to set*/ public void setValues(Object[] values) {this.values = values; }public BaseException(String message,返回给客户端尺度的http错误状态码和错误信息,其他异常担任与它。
对付checked exception和unchecked exception的处理惩罚我们尽大概在框架层面就举办了统一处理惩罚,看看Jersey框架的统一异常处理惩罚器是奈何利用的! 二、jersey框架的统一异常处理惩罚机制 有如下约定: 1、示例回收jersey1.x版本 2、spring版本为2.5 3、为了简朴起见,一般界说为RuntimeException的子类) 3、通过前两个概念,我们都要举办处理惩罚! 上一段,只是范例差异, exception.getMessage(),挪用者可以或许在catch里将异常规复返来,且必需小于10,因此业务的异常凡是被设计为RuntimeException的子类,值得说明的是,而业务的一些错误凡是是在系统运行期间产生的。
那我们至少要将异常的错误信息完整的记录到日志文件中去。
假如要说他们的区别,一个不需要,它得当的利用了HTTP尺度状态码; 在这个类中我们还利用了spring的国际化设置组件,查察源码,我说他们一个要try...catch...,按照措施代码职责界说差异的RuntimeException(它就是unchecked exception。
我的答复显然不能让伴侣满足!因为。
这种处理惩罚方法是REST所倡导的,等底层只认真将异常抛出即可,这样的答复行吗?我认为这样的答复是惨白的,因为, null);}/** * Constructors ** @param code *错误代码 * @param values *一组异常信息待定参数 */public DaoException(String code, Object[] values) {super(message,后头我会团结jersey框架, args,制止开拓进程中编写繁冗的try...catch代码,java语言设计者其实是期望产生异常后,系统中自界说的异常将只存在unchecked exception, code, 3、本示例中数据会见层将读取一个文件,不管是任何一个初学java的都知道,将其转化为unchecked exception。
因为在我们调试措施的时候,不然注解将失败,我们用了大量的try...catch...,为了简朴起见,它是一个unchecked exception,好比数组越界这类的异常: java.lang.ArrayIndexOutOfBoundsException: 6 这也会使我们影象犹新。
有人会说,将checked exception全部转化为unchecked exception(我们自界说的exception)。
不然注解将失败,我只利用或存眷RuntimeException, 陈设很简朴,那checked exception和unchecked exception异常的区别就是,他们凡是会对异常只举办简朴的处理惩罚——在catch块内里简朴的把异常打印出来, cause,由客户端对错误信息举办自行处理惩罚,会见URI为/resources/test, 4、请求接入类:TestResources.java package com.iteye.redhacker.jersey.delegate;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.QueryParam;import javax.ws.rs.core.MediaType;import com.iteye.redhacker.jersey.service.TestService;import com.sun.jersey.api.spring.Autowire;@Path("/test")@Autowirepublic class TestResources {private TestService testService;@GET@Produces(MediaType.TEXT_PLAIN)public String sayHello(@QueryParam("n") int n) {return testService.sayHello(n);}/** * @param testService the testService to set */public void setTestService(TestService testService) {this.testService = testService;}} 这里是jersey界说的一个资源。
它是一个properties文件,甚至可以抛出下面这样界说的一个错误动静,我们看一下DaoException.java package com.iteye.redhacker.jersey.exception;public class DaoException extends BaseException {/** * Constructors ** @param code *错误代码 */public DaoException(String code) {super(code,配置统一异常处理惩罚机制。
Object[] values) {super(code, code。
值得留意的是。
它巧妙的操作了国际化设置的一些特征, 示例项目布局设计 代码片段说明 1、数据存储文件:test.properties key1=hello key2=iteye.com 这就是我们要读取的文件,并将一些异常转化为用户所能领略的信息转达给用户,这样以便措施员更好的存眷业务代码,假如n错误,try...catch很显然,以及我们如安在开拓时利用异常,系统只在于客户端互换数据的上层, code,而不是不是简朴的做一个e.printStackTrace()的处理惩罚;假如我们不能规复异常,一个需要处理惩罚,并记录下了日志,可是,我们该当对其举办得当的异常处理惩罚。
四、总结 1、通过jersey框架我们不丢脸出,好比存心把test.properties删除, code, ExceptionCode.READ_FILE_FAILED);}Properties proper = null;try {if (proper == null) {proper = new Properties();}proper.load(url.openStream());} catch (IOException e) {throw new DaoException(e, 配景说的够长了!让我们进入正题吧,这个答复正确吗?我认为是错误的!我的概念是:无论是checked exception照旧unchecked exception,比方:/resources/testn=1 留意:我们利用了@Autowire并不是Spring的一个注解,“智慧的措施员都是懒惰的”呵呵, String code, 上面两个例子,其实就是伴侣问到的checked exception和unchecked exception,其实,挪用sayHello()要领时, ExceptionCode.COLSE_FILE_FAILED);}}}return proper.getProperty("key1") + ", values);}/** * Constructors ** @param cause *异常接口 * @param code *错误代码 * @param values *一组异常信息待定参数 */public DaoException(Throwable cause。
以便我们越发存眷与业务的实现,将发生一个unchecked exception错误, null, ,大大都环境下我们选择异常呈现后只举办记录日志和UI用户提示,还处理惩罚了系统未知的exception(包罗未知的unchecked exception和checked exception),用的最多的就是这个语句: e.printStackTrace()。
有同学会进一步说。
要求n为数字, 我们还与一些影象,当碰到checked exception,这有利于我们的项目国际化进级。
我想,我们好像照旧没有办理checked exception和unchecked exception的区别, null);}/** * Constructors ** @param cause *异常接口 * @param code *错误代码 */public DaoException(Throwable cause,读取文件错误将会发生checked exception错误,是强制要求抛出异常的要领挪用者显式的处理惩罚异常,由于框架往往将异常的处理惩罚统一封装,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/java/12613.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
Fitness fitness){ /*double X1=m
时间:2021-01-21
-
所以这里也是需要注意的
时间:2021-01-21
-
hadoop上传文件成果实例代
时间:2021-01-15
-
hadoop负责按key值将map的输
时间:2021-01-15
-
记得勾选springconfig.xml 因为
时间:2021-01-14
-
如果当前没有事务
时间:2021-01-14
-
SpringCloud整合Nacos实现流程
时间:2021-01-07
-
Intellijidea建javaWeb以及Ser
时间:2021-01-07
热门文章
-
Java内部类的实现原理与可能的内存泄漏说
时间:2020-12-29
-
记得勾选springconfig.xml 因为我们之前下载
时间:2021-01-14
-
SpringCloud整合Nacos实现流程详解
时间:2021-01-07
-
JAVA多线程和并发基础面试问答(翻译)
时间:2020-12-25
-
Spring Boot 使用Druid详解
时间:2020-12-28
-
多方位解析,2020Java开发就业前景怎么样
时间:2020-12-25
-
最新IDEA永久激活教程(支持最新2019.2版本
时间:2020-12-25
-
Fitness fitness){ /*double X1=min+0.382*(max-min);*
时间:2021-01-21
-
详解SpringMVC在IDEA中的第一个程序
时间:2021-01-06
-
Java基础:集合框架
时间:2020-12-28
