我可以知道在@ControllerAdvice中调用了哪个控制器吗?

时间:2017-10-12 04:57:51

标签: java annotations

现在,我在Spring 4中使用@ControllerAdvice。*。 使用beforeBodyWrite方法。

在控制器类中创建自定义注释。 在@ControllerAdvice处理时获取控制器的信息。

我想知道来自控制器类的请求。

但是,我不知道解决方案。

任何帮助。?

感谢

1 个答案:

答案 0 :(得分:0)

虽然您的问题没有明确说明您要达到的目的是什么,为什么需要创建自定义注释,但我会向您发布一些指导原则,说明如何确定RuntimeException的来源在ControllerAdvice

给出以下Rest控制器:

@RestController
public class CARestController {
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String testException() {
        throw new RuntimeException("This is the first exception");
    }
}

@RestController
public class CAOtherRestController {
    @RequestMapping(value = "/test-other", method = RequestMethod.GET)
    public String testOtherException() {
        throw new RuntimeException("This is the second exception");
    }
}

两者都抛出异常,我们可以使用以下ControllerAdvice捕获此异常,并使用堆栈跟踪确定异常的来源。

@ControllerAdvice
public class CAControllerAdvice {
    @ExceptionHandler(value = RuntimeException.class)
    protected ResponseEntity<String> handleRestOfExceptions(RuntimeException ex) {
        return ResponseEntity.badRequest().body(String.format("%s: %s", ex.getStackTrace()[0].getClassName(), ex.getMessage()));
    }
}

这是端点输出的外观:

Output of First Controller Output of second Controller

我的建议是,不是这样做,而是声明自己的一组异常,然后在控制器建议中捕获它们,并且独立于它们被抛出的位置:

public class MyExceptions extends RuntimeException {
}

public class WrongFieldException extends MyException {
}

public class NotFoundException extends MyException {
}

@ControllerAdvice
public class CAControllerAdvice {
    @ExceptionHandler(value = NotFoundException .class)
    public ResponseEntity<String> handleNotFound() {
        /**...**/
    }
    @ExceptionHandler(value = WrongFieldException .class)
    public ResponseEntity<String> handleWrongField() {
        /**...**/
    }
}