Spring不会从控制器返回JSON以查找错误

时间:2017-02-06 19:53:03

标签: json rest spring-mvc

我在其他问题上看了很多,但我没有看到任何与我的问题相同的问题。

我正在重构遗留应用程序并实现Spring,我使用web.xml在WebSphere中运行Spring 4.

我的控制器使用@ResponseBody注释,当没有异常时,他们返回杰克逊处理的JSON罚款,但是如果有异常,则响应的主体不是JSON,因此,我无法很好地处理它们在我的前端Javascript。

例如,如果我在需要POST的端点上使用GET,我希望看到这样的JSON:

{
  "timestamp": 1486410302434,
  "status": 405,
  "error": "Method Not Allowed",
  "exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
  "message": "Request method 'GET' not supported",
  "path": "/greeting"
}

但我得到了这个:

Error 405: Request method 'GET' not supported

如何在发生异常时配置环境以返回JSON?

这是我的网络配置:

@Configuration
@EnableWebMvc
@ComponentScan("hello")
public class WebConfig {

    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();

        resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
        resolver.setPrefix("/Pages");
        resolver.setSuffix(".jsp");

        return resolver;
    }

我的web.xml:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>


    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

1 个答案:

答案 0 :(得分:1)

Spring的HandlerExceptionResolvers执行异常映射。 This articlethis article描述了处理异常的多种处理机制。

您可以实现自己的HandlerExceptionResolver并发送回您想要的数据。

如果您只需要一个例外,可以使用@ControllerAdvice

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.NOT_ALLOWED)  // 405
    public void handleConflict() {
        // Return whatever JSON you need
    }
}

我不知道可以将错误输出更改为JSON的标志。