我有一个春季启动应用程序。
我有一个自定义错误控制器,映射到使用ErrorPage
映射。映射主要基于HTTP状态代码,通常只是适当地呈现HTML视图。
例如,我的映射:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize( ConfigurableEmbeddedServletContainer container ) {
container.addErrorPages( new ErrorPage( HttpStatus.NOT_FOUND, "/error/404.html" ) )
}
我的错误控制器:
@Controller
@RequestMapping
public class ErrorController {
@RequestMapping( value = "/error/404.html" )
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public String pageNotFound( HttpServletRequest request ) {
"errors/404"
}
这很好用 - 如果我只是输入一个随机不存在的URL,那么它会呈现404页面。
现在,我想要一个我的网站的一部分,让我们说/api/..
专门用于我的JSON api以将错误作为JSON提供,所以如果我在/ api /下输入一个随机不存在的URL。然后它返回404 JSON响应。
有没有标准/最好的方法来做到这一点?我尝试过的一个想法是让@ControllerAdvice
专门捕获我定义的一类自定义API异常并返回JSON,并在我的标准ErrorController中检查URL并在该API URL空间下抛出apprpriate API异常(但这不起作用,因为无法调用ExceptionHandler方法,因为它是与原始控制器方法不同的返回类型)。
这件事已经解决了吗?
答案 0 :(得分:1)
问题是我自己的错。我试图找出为什么我的@ExceptionHandler
无法捕获我的异常并返回JSON - 正如我在问题的最后建议的那样,我认为因为返回类型冲突而遇到问题 - 这是不正确的。
我试图让我的异常处理程序返回JSON的错误是:
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
"message": "Could not find acceptable representation"
我做了一些挖掘/试验以尝试缩小问题范围(认为问题是因为我在Spring错误处理流程中和导致问题的ErrorController
中),但是问题只是因为Spring的内容协商。
因为我在web.xml
中的errorPage映射映射到/error/404.html
,所以Spring使用后缀来解析相应的视图 - 所以当我尝试返回json时它会失败。
我已经能够通过将我的web.xml更改为/error/404
或关闭内容协商后缀选项来解决此问题。
答案 1 :(得分:0)
现在,我想要一个我的网站的一部分,让我们说/ api / ..这是专用的 我的JSON api将错误作为JSON提供,所以如果我输入一个随机的 / api / ..下不存在的URL然后返回404 JSON响应。
有没有标准/最好的方法来做到这一点?我试过的一个想法是 有一个@ControllerAdvice专门捕获了一类自定义 我已定义并返回JSON的API异常,以及我的标准 ErrorController检查URL并抛出apprpriate API 如果在该API URL空间下(但不起作用,则为例外) 无法调用ExceptionHandler方法,因为它是一个 与原始控制器方法不同的返回类型)。
我认为你需要重新思考你在这里要做的事情。根据HTTP响应代码here
404或Not Found错误消息是HTTP标准响应代码 表明客户端能够与给定的通信 服务器,但服务器找不到请求的内容。
因此,在输入随机网址时,您可能不希望一直抛出404。如果您正在尝试处理错误的请求,您可以执行类似的操作
@ControllerAdvice
public class GlobalExceptionHandlerController {
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public ResponseEntity<ErrorResponse> noRequestHandlerFoundExceptionHandler(NoHandlerFoundException e) {
log.debug("noRequestHandlerFound: stacktrace={}", ExceptionUtils.getStackTrace(e));
String errorCode = "400 - Bad Request";
String errorMsg = "Requested URL doesn't exist";
return new ResponseEntity<>(new ErrorResponse(errorCode, errorMsg), HttpStatus.BAD_REQUEST);
}
}
根据您的需要构建ResponseEntity
。