我目前正在设置Spring MVC应用程序(版本4.1.4.RELEASE),我希望应用程序在404错误而不是默认的html响应上返回JSON字符串。我使用Tomcat 8作为我的服务器。我有认为应该是正确的,但它不会以我期望的方式表现。我试图做的是基于this answer.
public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
...
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration){
registration.setInitParameter("throwExceptionIfNoHandlerFound","true");
}
}
然后我有一个异常控制器(这与我基于我的解决方案的问题不同,但我不相信这是一个问题,因为我认为@ControllerAdvice是一种可接受的方式基于Spring Docs管理这个。它看起来像:
@ControllerAdvice
public class GlobalExceptionController{
@ResponseStatus(value=HttpStatus.NOT_FOUND)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Message handleMethodNotSupported(HttpServletRequest request){
...
}
@ResponseStatus(value=HttpStatus.NOT_FOUND)
@ExceptionHandler(NoSuchRequestHandlingMethodException.class)
public Message handleBadRequest(HttpServletRequest request){
...
}
@ResponseStatus(value=HttpStatus.NOT_FOUND)
@ExceptionHandler(NoHandlerFoundException.class)
public Message requestHandlingNoHandlerFound(HttpServletRequest request){
...
}
...
}
继续发回默认响应。我知道它正在命中我的customizeRegistration()函数,因为断点会阻止它,但是,我的GlobalException类中的任何断点都没有被命中。此外,GlobalException类位于由@ComponentScan()注释命中的包中,因此我相信它也是由spring处理的。
我认为我错过了一些明显的东西,任何帮助都会非常感激。
答案 0 :(得分:0)
我认为不支持您尝试使用的返回类型。您是否尝试将返回值更改为ResponseEntity或添加@ResponseBody注释? From the docs:
- ModelAndView对象(Servlet MVC或Portlet MVC)。
- 一个Model对象,其视图名称通过RequestToViewNameTranslator隐式确定。
- 用于公开模型的Map对象,其中视图名称通过RequestToViewNameTranslator隐式确定。
- 一个View对象。
- 一个字符串值,被解释为视图名称。
- @ResponseBody注释方法(仅限Servlet)设置响应内容。返回值将转换为响应流 使用消息转换器。
- 用于设置响应标头和内容的HttpEntity或ResponseEntity对象(仅限Servlet)。 ResponseEntity正文将是 使用消息转换器转换并写入响应流。
- 如果方法处理响应本身(通过直接写入响应内容,声明类型的参数),则为void ServletResponse / HttpServletResponse / RenderResponse 目的)或者是否应该隐含地确定视图名称 通过RequestToViewNameTranslator(不声明响应 处理程序方法签名中的参数;仅适用于Servlet 环境)。