我已经例外了,当我想要一个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) 我有Spring MVC和jackson.当我开始一个不正确的请求时,杰克逊映射失败并被UnrecognizedPropertyException抛出.我想使用处理此异常
@ExceptionHandler
public String handle(UnrecognizedPropertyException e) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,Spring包含此异常,HttpMessageConversionException因此上面的代码不起作用.是否有可能在Spring中处理Jackson特定的(或一般的库特定的)异常?
我正在使用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 3.2.15,这里基于 MVC 的 REST API(不是Spring Boot,遗憾的是!)。我正在尝试实现一个满足以下条件的异常映射器/处理程序:
MyAppResponse(见下文);和BlahException)必须映射到 HTTP 422FizzBuzzException有自己的状态映射方案:
FizzBuzzException-> HTTP 401FooBarException-> HTTP 403OmgException-> HTTP 404对象所在位置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)