英文:
Spring boot change override exception responses
问题
Sure, here's the translated content:
我正在尝试自定义异常响应并使用自己的响应结构,我正在使用以下方式:
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public ResponseEntity<String> handle(Exception ex, HttpServletRequest request)
{
// ...
}
}
但是我无法访问状态码,我需要通过 `ResponseStatus` 在异常中定义的状态码:
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
public class ExtendSubscriptionReminderNotExistException extends RuntimeException
{
}
英文:
I am trying to customize exception responses and use my own response structure, I am using below way :
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public ResponseEntity<String> handle(Exception ex, HttpServletRequest request)
{
...
}
}
But I have not accessed to the status code, I need status code that defined in exceptions via ResponseStatus
:
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
public class ExtendSubscriptionReminderNotExistException extends RuntimeException
{
}
答案1
得分: 1
使用 Java 反射机制,您可以这样实现:
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public ResponseEntity<String> handle(Exception ex, HttpServletRequest request) {
if (ex instanceof ExtendSubscriptionReminderNotExistException) {
ResponseStatus status = ExtendSubscriptionReminderNotExistException.class.getAnnotation(ResponseStatus.class);
return ResponseEntity.status(status.value()).body(ex.getMessage());
} else {
// 如果不是 ExtendSubscriptionReminderNotExistException,执行其他操作
}
}
以下是有关如何在 Java 中读取注解的有用文章:Java 反射 - 注解
如果您想要覆盖 ResponseStatusExceptionResolver,则应该extends AbstractHandlerExceptionResolver
并实现自己的 doResolveException
,就像 ResponseStatusExceptionResolver 所做的那样,然后创建一个扩展 WebMvcConfigurationSupport
的配置,并覆盖 configureHandlerExceptionResolvers,然后 Spring 将会选择您自己的异常解析器而不是默认的。其中的逻辑在这里。
英文:
With java reflection mechanism, you can do it like so:
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public ResponseEntity<String> handle(Exception ex, HttpServletRequest request) {
if (ex instanceOf ExtendSubscriptionReminderNotExistException) {
ResponseStatus status = ExtendSubscriptionReminderNotExistException.class.getAnnotation(ResponseStatus.class);
return ResponseEntity.status(status.value()).body(ex.getMessage());
}else{
//if it's not ExtendSubscriptionReminderNotExistException, do sth different
}
}
Here is an useful article on how to read annotation in java: Java Reflection - Annotations
If you want to override ResponseStatusExceptionResolver, then you should extends AbstractHandlerExceptionResolver
and implement your own doResolveException
like ResponseStatusExceptionResolver did, then create a configuration extending WebMvcConfigurationSupport
and override configureHandlerExceptionResolvers, then spring will pick up your own exception resolver over the default one. The logic behind this is here.
答案2
得分: 0
我可能在这件事上有所错误,但对我来说,同时使用*@ResponseStatus注解和自定义ErrorHandler*实在没有太多道理。
注解的目的是使你的代码更容易理解,并避免使用这种处理程序。
如果你真的想使用这个处理程序,我建议放弃使用注解,而是在每个异常中存储相应的状态码(例如,作为final static
属性)。
英文:
I may be wrong on this one, but to me it doesn't really make sense to use @ResponseStatus annotation and a custom ErrorHandler at the same time.
Annotations are supposed to make your code easier to understand and to avoid using such handlers.
If you really want to use the handler, I'd suggest to drop the annotation and store the corresponding status code in each exception (as a final static
attribute for example).
答案3
得分: 0
我们无法更改异常消息。但是,我们可以确定更改代码和类,然后通过覆盖相同的类和相同的代码,但不同的消息来抛出一个新的异常。
英文:
we cannot change exception messages. However determine we can change the code and class, and throw a new one by overriding the same class with the same code and different message.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论