Java 用于响应逻辑的Spring启动应用程序中的自定义异常调度程序
我有一个Spring Boot应用程序,其大致结构如下:Java 用于响应逻辑的Spring启动应用程序中的自定义异常调度程序,java,exception,spring-boot,exception-handling,Java,Exception,Spring Boot,Exception Handling,我有一个Spring Boot应用程序,其大致结构如下: 计划 原料药 阿皮普勒 应用 Api是一个接口,看起来如下: public interface Api { public String methodOne(...) throws ExceptionOne, ExceptionTwo, ExceptionThree; ... public int methodN(...) throws ExceptionOne, ExceptionThree, Exc
- 计划
- 原料药
- 阿皮普勒
- 应用
Api
是一个接口
,看起来如下:
public interface Api {
public String methodOne(...) throws ExceptionOne, ExceptionTwo, ExceptionThree;
...
public int methodN(...) throws ExceptionOne, ExceptionThree, ExceptionFour;
}
apimpls
是请求控制器(实际上还有第二层,但对于本例来说这就足够了)。在这里,我现在做了如下事情:
@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…),但在其他方面非常适合处理内部应用程序逻辑
我的问题是:如何实现一个定制的异常调度程序,用Java处理这个问题?理想情况下,我希望有一些类似的情况,但不幸的是,简单地说,<代码>抛出<代码> >当前的异常,就像在我所知道的那样,在C++中java代码是不可能的。为了简单起见,我想完成以下几点:
@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);
}
}
这正如预期的那样工作,我可以根据需要处理不同的异常类型(这里使用构造函数显示,但原理是一样的)。但是,这感觉非常笨拙。如果您正在寻找全局处理所有控制器层异常(在Spring MVC体系结构中),您可以使用Spring提供的
@ExceptionHandler
方法在一个地方为所有控制器(option1下面)执行该操作
选项(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
public class ApiImpl {
public String methodOne(...) {
}
@ExceptionHandler(ExceptionOne.class)
public R exceptionTwo(ExceptionOne exe) {
//set proper response code and return values
}
//other exceptions
}
您可以在上了解更多信息。您是否希望捕获Spring控制器层异常?或者您是在谈论任何层的一般异常吗?基本上,
apimpl
(@Controller
)中的方法调用一个内部实现,该实现可以引发实际的异常。我将这些异常传播到@Controller
,这就是我在那里处理的响应结构。感谢您的响应!这看起来是一个很有希望的方法。一旦我有权访问我的项目文件,我就会尝试一下。但是,理想情况下,我希望将所有响应逻辑保留在实际控制器中,而不是第二个类。@Controller
是否也可能是@ControllerAdvice
,或者以其他方式处理其自身的异常
处理?您可以在控制器类本身中作为@ExceptionHandler方法来处理