Spring Boot 如何处理可抛出对象
Posted
技术标签:
【中文标题】Spring Boot 如何处理可抛出对象【英文标题】:Spring boot how to handle throwable 【发布时间】:2017-08-10 18:28:55 【问题描述】:我做了一个这样的项目sample。所以控制器是这样的
package mypackagename.controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@RequestMapping("/")
public class StoresRestController
@RequestMapping(method = RequestMethod.GET)
public String stores()
return ...
我喜欢处理所有 throwable 并做出我定制的统一响应。问题是我找不到正确执行此操作的指南或示例。
首先,我尝试了ExceptionHandler
和Throwable
,但没有成功,所以我决定继续。然后,我发现最接近的方法是this,所以我尝试了球衣,添加了类似this 的东西。但它并不适用于所有的投掷物。此外,它通过抱怨无视我的控制器
o.g.jersey.internal.inject.Providers : A provider mypackagename.controller.StoresRestController registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider mypackagename.controller.StoresRestController will be ignored.
我搜索了这个错误并找到了this,我没有在我的项目中使用ContainerResponseFilter
,因为我提供了上面的示例。所以我一无所知。主要问题是如何处理所有 throwables,但如果您能给我一些关于如何解决 Providers
问题的建议,我将不胜感激。
【问题讨论】:
谢谢,我也试过@ExceptionHandler。但据我了解,它们并非旨在处理所有可投掷物。 实际上,正如我解释的那样,我尝试了带有 throwable 的 ExceptionHandler,但它不起作用,所以我尝试了其他解决方案,例如 jersey。 没有我想捕捉的特殊异常。当我的应用程序抛出任何类型的异常时,我希望有一个统一的响应。例如,我不希望在我的响应中包含“时间戳”,它包含在标准弹簧响应中。 首先,输入try-catch
会使我的控制器变得丑陋!框架必须抓住它们。这是控制器的目的,除非我想自己处理所有事情!其次,授权过程中的异常呢,它们不是控制器!那么框架本身的异常呢?我想在一个地方处理所有这些并有一个统一的响应。
感谢您的回答。通过 sping-boot 异常,我的意思是“未找到”。例如,我想更改此““timestamp”:1489933640236,"status":404,"error":"Not Found","message":"No message available","path":"/api/v1 /store/245/sfadf"" 对此响应 ""message":"No message available""。 @ControllerAdvice
和 @ExceptionHandler
也不能与 Throwable.class
一起使用,我再次对其进行测试。
【参考方案1】:
在我的项目中,我使用@ControllerAdvice 来处理我的异常。这是一个例子。希望这可以帮助。只需确保此类在您的组件扫描中,以便它被拾取。
@RestController
@ControllerAdvice
public class StoresExceptionHandler
@ExceptionHandler(Throwable.class)
public ResponseEntity<Object> handleThrowable(final Throwable ex)
return new ResponseEntity<Object>("Unable to process request.", HttpStatus.INTERNAL_SERVER_ERROR);
【讨论】:
【参考方案2】:最后this 帖子帮助我处理了所有Throwable
s,除了身份验证异常。重要的部分是使用@EnableWebMvc
和ResponseEntityExceptionHandler
。为了处理身份验证异常,我使用了this 答案。希望它对某人有所帮助。
【讨论】:
以上是关于Spring Boot 如何处理可抛出对象的主要内容,如果未能解决你的问题,请参考以下文章