Spring Boot Application中的自定义异常调度程序用于响应逻辑

时间:2016-11-04 23:23:49

标签: java exception spring-boot exception-handling

我有一个具有以下近似结构的Spring Boot应用程序:

  • 项目
    • 阿比
    • ApiImpl
    • 应用

Apiinterface,如下所示:

public interface Api {
    public String methodOne(...) throws ExceptionOne, ExceptionTwo, ExceptionThree;

    ... 

    public int methodN(...) throws ExceptionOne, ExceptionThree, ExceptionFour;
}

ApiImpls是请求控制器(实际上有第二层,但这应该足以满足此示例)。在那里,我现在做了类似下面的事情:

@Controller
public class ApiImpl {

    public String methodOne(...) {

        try {
            // do stuff that can yield an exception
        }
        catch(ExceptionOne e) {
            // set proper response code and return values
        }
        catch(ExceptionTwo e) {
            // set proper response code and return values
        }
        catch(ExceptionThree e) {
            // set proper response code and return values
        }
    }
}

基本上,这种行为会产生重复的批次(可能也会将我的例外D,R和Y命名为......),但是非常适合处理内部应用程序逻辑。 / p>

我的问题是:如何实现一个可以在Java中处理此问题的自定义异常调度程序?理想情况下,我想要像this answer here这样的东西,但不幸的是只是throw当前的异常,就像我知道的那样,Java中的C ++代码是不可能的。为简洁起见,我想要完成的事情如下:

@Controller
public class ApiImpl {

    public String methodOne(...) {

        try {
            // do stuff that can yield an exception
        }
        catch(ExceptionOne e) {
            handle()
        }
    }

    private void handle() { // maybe Throwable or Exception subclass as parameter
      // handle the correct exception type, set correct response code, etc.
    }
}

有没有什么好方法可以做到这一点,以尽量减少代码重复?

这是我试图让这项工作的初步尝试:

public class Thrower {

    public Thrower(int e) throws ExceptionOne, ExceptionTwo, ExceptionThree {
        if(e == 0) {
            throw new ExceptionOne();
        }
        if(e == 1) {
            throw new ExceptionTwo();
        }
        if(e == 2) {
            throw new ExceptionThree();
        }
    }
}

class ExceptionOne extends Exception {}
class ExceptionTwo extends Exception {}
class ExceptionThree extends Exception {}

public class ExceptionHandler {

    private void handle(Exception ex) throws Exception  {
        try {
            throw ex;
        }
        catch(ExceptionOne e) {
            e.printStackTrace();
            System.out.println("Exception one");
        }
        catch(ExceptionTwo e) {
            e.printStackTrace();
            System.out.println("Exception two");
        }
        catch(ExceptionThree e) {
            e.printStackTrace();
            System.out.println("Exception three");
        }
    }

    public void causesException(int which) throws Throwable {
        try {
            Thrower t = new Thrower(which);
        }
        catch(Exception e) {
            handle(e);
        }
    }

    public static void main(String[] args) throws Throwable {
        ExceptionHandler eh = new ExceptionHandler();

        eh.causesException(0);
        eh.causesException(1);
        eh.causesException(2);

    }
}

这按预期工作,我可以根据需要处理不同的异常类型(这里使用构造函数显示,但原理是相同的)。然而,这感觉非常笨重。

1 个答案:

答案 0 :(得分:3)

如果您正在寻找全局处理所有控制器层异常(在Spring MVC架构中),您可以使用@ExceptionHandler方法在一个位置为所有控制器(下面的 option1 )执行此操作这是来自Spring的ControllerAdvice

选项(1):在单独的类中配置例外

@ControllerAdvice
class MyProjectExceptionHandler {

   @ExceptionHandler(value = ExceptionOne.class)
   public R exceptionOne(ExceptionOne exe) {
      //set proper response code and return values
   }

   @ExceptionHandler(value = ExceptionTwo.class)
   public R exceptionTwo(ExceptionTwo exe) {
      //set proper response code and return values
   }
}

选项(2):在控制器类本身中配置例外

如果您正在寻找处理Controller类本身中的异常,那么您可以按照以下方式执行此操作:

@Controller
public class ApiImpl {

    public String methodOne(...) {

    }

    @ExceptionHandler(ExceptionOne.class)
    public R exceptionTwo(ExceptionOne exe) {
      //set proper response code and return values
   }

   //other exceptions
  }

您可以在here

了解详情