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 并做出我定制的统一响应。问题是我找不到正确执行此操作的指南或示例。

首先,我尝试了ExceptionHandlerThrowable,但没有成功,所以我决定继续。然后,我发现最接近的方法是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 帖子帮助我处理了所有Throwables,除了身份验证异常。重要的部分是使用@EnableWebMvcResponseEntityExceptionHandler。为了处理身份验证异常,我使用了this 答案。希望它对某人有所帮助。

【讨论】:

以上是关于Spring Boot 如何处理可抛出对象的主要内容,如果未能解决你的问题,请参考以下文章

如何处理可呈现图像的布局?

发布 TypeScript 包时如何处理可选的对等依赖项?

构造准备好的语句时如何处理可选列

Go中的make函数如何处理可选参数? [复制]

想要启用可空引用类型时如何处理可选参数?

spriing boot 实战