在XML免费项目中使用spring在404返回JSON

时间:2015-02-26 18:28:56

标签: java json spring spring-mvc

我目前正在设置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处理的。

我认为我错过了一些明显的东西,任何帮助都会非常感激。

1 个答案:

答案 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   环境)。
  •