相关疑难解决方法(0)

如何重新抛出异常春@ExceptionHandler为@ ResponseStatus注解异常?

我已经例外了,当我想要一个404页面时,我总是扔掉它:

@ResponseStatus( value = HttpStatus.NOT_FOUND )
public class PageNotFoundException extends RuntimeException {
Run Code Online (Sandbox Code Playgroud)

我想创建控制器范围@ExceptionHandler,将重新掷ArticleNotFoundException(这会导致错误500)作为我的404例外:

@ExceptionHandler( value=ArticleNotFoundException.class )
public void handleArticleNotFound() {
    throw new PageNotFoundException();
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用 - 我仍然有错误500和Spring日志:

ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: ...

请注意,我将代码翻译为html,因此响应不能为空或简单的字符串ResponseEntity.web.xml条目:

<error-page>
    <location>/resources/error-pages/404.html</location>
    <error-code>404</error-code>
</error-page>
Run Code Online (Sandbox Code Playgroud)

最终的解决方案回答者:评论

这不是一个全面的重新抛出,但至少它使用web.xml错误页面映射喜欢我PageNotFoundException

    @ExceptionHandler( value = ArticleNotFoundException.class )
    public void handle( HttpServletResponse response) throws IOException {
        response.sendError( HttpServletResponse.SC_NOT_FOUND );

    }
Run Code Online (Sandbox Code Playgroud)

java spring exception-handling exception spring-mvc

9
推荐指数
1
解决办法
6561
查看次数

处理spring mvc中的包装异常

我有Spring MVC和jackson.当我开始一个不正确的请求时,杰克逊映射失败并被UnrecognizedPropertyException抛出.我想使用处理此异常

@ExceptionHandler
public String handle(UnrecognizedPropertyException e) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

但是,Spring包含此异常,HttpMessageConversionException因此上面的代码不起作用.是否有可能在Spring中处理Jackson特定的(或一般的库特定的)异常?

java spring exception-handling exception spring-mvc

8
推荐指数
1
解决办法
4818
查看次数

Spring控制器建议无法正确处理CompletableFuture异常完成

我正在使用Spring Boot 1.5,我有一个异步执行的控制器,返回一个CompletableFuture<User>.

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private final UserService service;

    @GetMapping("/{id}/address")
    public CompletableFuture<Address> getAddress(@PathVariable String id) {
        return service.findById(id).thenApply(User::getAddress);
    }
}
Run Code Online (Sandbox Code Playgroud)

该方法UserService.findById可以抛出一个UserNotFoundException.所以,我开发了专门的控制器建议.

@ControllerAdvice(assignableTypes = UserController .class)
public class UserExceptionAdvice {
    @ExceptionHandler(UserNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public String handleUserNotFoundException(UserNotFoundException ex) {
        return ex.getMessage();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,在向控制器发出未知用户请求的情况下,测试不会返回HTTP 500状态而不是404状态.

这是怎么回事?

spring java-8 spring-boot completable-future

8
推荐指数
1
解决办法
1999
查看次数

Spring MV 3.2 异常响应映射

Spring 3.2.15,这里基于 MVC 的 REST API(不是Spring Boot,遗憾的是!)。我正在尝试实现一个满足以下条件的异常映射器/处理程序:

  • 无论发生什么(成功或错误),Spring 应用程序始终返回一个响应实体MyAppResponse(见下文);和
  • 如果成功处理请求,则返回 HTTP 状态 200(典型);和
  • 如果处理请求并发生异常,我需要控制特定异常到特定 HTTP 状态代码的映射
    • Spring MVC 框架错误(例如BlahException)必须映射到 HTTP 422
    • 自定义应用程序例外,例如我FizzBuzzException有自己的状态映射方案:
      • FizzBuzzException-> HTTP 401
      • FooBarException-> HTTP 403
      • OmgException-> HTTP 404
    • 所有其他异常,即非 Spring 异常和非自定义应用程序异常(上面列出的 3 个),应该生成 HTTP 500

对象所在位置MyAppResponse

// Groovy pseudo-code
@Canonical
class MyAppResponse {
    String detail
    String randomNumber
}
Run Code Online (Sandbox Code Playgroud)

看起来也许ResponseEntityExceptionHandler为我做到这一点,但我并没有透过树木看到森林,因为它是如何传递参数的。我希望我能做这样的事情:

// Groovy-pseudo code
@ControllerAdvice
class MyAppExceptionMapper extends ResponseEntityExceptionHandler {
    ResponseEntity<Object> handleFizzBuzzException(FizzBuzzException …
Run Code Online (Sandbox Code Playgroud)

exception spring-mvc httpresponse

5
推荐指数
1
解决办法
2793
查看次数