resteasy 异常处理

来源:互联网 发布:魔卡幻想淘宝号安全吗 编辑:程序博客网 时间:2024/04/30 16:03

运行环境      

        resteasy提供了一个ExceptionMapper接口异常处理.

         本次采用servlet3.0容器(为了方便使用initializer)

example

pom.xml

<dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jaxrs</artifactId><version>3.1.3.Final</version></dependency><dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-servlet-initializer</artifactId><version>3.1.3.Final</version></dependency>

        ExceptionMapper注册有多用方式有基于@Provider注解的,有基于web.xml的,本次基于web.xml方式

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                 xmlns="http://java.sun.com/xml/ns/javaee"                 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"                 id="JAXRS-RESTEasy" version="3.0">    <display-name>JAXRS-RESTEasy</display-name><context-param><param-name>resteasy.providers</param-name><param-value>stu.resteasy.MyExceptionHandler2,stu.resteasy.MyExceptionHandler,stu.resteasy.MyExceptionHandler3</param-value></context-param>  </web-app>
          注:上面注册了多个ExceptionHandler,用于处理不同的exception,一个exception只会被一个ExceptionHandler处理

MyExceptionHandler

package stu.resteasy;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;//@Providerpublic class MyExceptionHandler implements ExceptionMapper<ArithmeticException> {@Overridepublic Response toResponse(ArithmeticException exception) {String message = "arithmeticException catch:" + exception.getMessage(); return Response.status(Status.BAD_REQUEST).entity(message).build(); }}

MyExceptionHandler2

package stu.resteasy;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;//@Providerpublic class MyExceptionHandler2 implements ExceptionMapper<Exception> {@Overridepublic Response toResponse(Exception exception) {String message = "exception catch:" + exception.getMessage(); return Response.status(Status.BAD_REQUEST).entity(message).build(); }}

MyExceptionHandler3

package stu.resteasy;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;//@Providerpublic class MyExceptionHandler3 implements ExceptionMapper<NumberFormatException> {@Overridepublic Response toResponse(NumberFormatException exception) {String message = "numberFormatException catch:" + exception.getMessage(); return Response.status(Status.BAD_REQUEST).entity(message).build(); }}

Application

package stu.resteasy;import java.util.HashSet;import java.util.Set;import javax.ws.rs.ApplicationPath;import javax.ws.rs.core.Application;@ApplicationPath("/rest")public class TestApplication extends Application {  private static Set<Class<?>> classes = new HashSet<Class<?>>();    @Override    public Set<Class<?>> getClasses() {    //注册服务,可注册多个        classes.add(TestResource.class);        return classes;    }}

resource
package stu.resteasy;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.core.Response;     @Path("/testResource")  public class TestResource {      @GET     @Path("/{param}")      public Response printMessage(@PathParam("param") String msg){              String result = "Restful example : " + msg;          //不是数字将抛出numberFormatException(抛出异常,后面代码不再执行)        Integer.parseInt(msg);        //抛出ArithmeticException        int i=1/0;        return Response.status(200).entity(result).build();      }  } 

          访问:http://localhost:8080/rest/testResource/helloworld

          打印:numberFormatException catch:For input string: "helloworld"

       访问 http://localhost:8083/rest/testResource/1

       打印:arithmeticException catch:/ by zero

       由上可以看到,一个exception只会被一个exceptionHandle捕获处理.先找此异常对应的handler,找不到,找其父类的handler,一直往上找,找不到,将报500错误.项目中一个会有一个大的Throwable捕获处理


原创粉丝点击