Spring webapp的Generic @ExceptionHandler,具有不同的返回值

时间:2013-10-19 15:30:18

标签: spring spring-mvc

我正在尝试为Spring编写一个Servlet Exception处理程序,它可以返回一个html(如果请求是针对html页面)还是一个json(针对REST api调用)。 html部分运行良好,因为我已经配置了HandlebarsViewResolver,因此下面代码中的“else”部分搜索exception.hbs并且运行良好。 但是当我尝试设置MappingJacksonJsonView时,spring尝试查找MappingJacksonJsonView.hbs并且实际上并没有使用MappingJacksonJsonView将POJO(jsonErrorObject)转换为json并返回它。

有人可以帮助我,让我知道如何使这个通用异常处理程序工作,可以通过MappingJacksonJsonView返回一个处理程序视图或一个json?

Java代码

@ExceptionHandler(Exception.class)
@ResponseStatus (value = HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleAnyException(Exception e, HttpServletRequest request) {
    ModelAndView mav = new ModelAndView();
    if (request.getHeader("Accept").contains("application/json")) {
            mav.setViewName("myJSON", "result", jsonErrorObject);
        } else {
            mav.setViewName("exception");
            mav.addObject("exceptionMessage", jsonErrorObject.getResDescr());
        }
    return mav;
}

servlet.xml中

<bean id="hbsViewResolver" class="com.github.jknack.handlebars.springmvc.HandlebarsViewResolver">
    <property name="prefix" value="/WEB-INF/hbs/" />
    <property name="suffix" value=".hbs" />
    <property name="order" value="1" />
</bean>

<bean name="myvr" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="html" value="text/html" />
        </map>
    </property>
    <property name="viewResolvers">
        <list>
            <ref local="hbsViewResolver" />
        </list>
    </property>
    <property name="defaultViews">
        <list>
            <bean name="myJSON" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
    </property>
</bean> 

0 个答案:

没有答案