Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于响应逻辑的Spring启动应用程序中的自定义异常调度程序_Java_Exception_Spring Boot_Exception Handling - Fatal编程技术网

Java 用于响应逻辑的Spring启动应用程序中的自定义异常调度程序

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

我有一个Spring Boot应用程序,其大致结构如下:

  • 计划
    • 原料药
    • 阿皮普勒
    • 应用
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方法来处理