Java SpringMVC异常处理程序是否只能支持类型视图的返回类型?

Java SpringMVC异常处理程序是否只能支持类型视图的返回类型?,java,spring,spring-mvc,Java,Spring,Spring Mvc,上述代码不起作用。StackTrace看起来像这样: org.springframework.web.util.NestedServletException: 请求处理失败;嵌套 例外是 java.lang.RuntimeException:erorrrrr 位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) 位于org.springframework.web.s

上述代码不起作用。StackTrace看起来像这样:

org.springframework.web.util.NestedServletException: 请求处理失败;嵌套 例外是 java.lang.RuntimeException:erorrrrr 位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) 位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:847)


我查看了,基于此,异常处理程序似乎只能返回视图。这是真的吗?

您必须让Spring知道如何通过异常处理程序转换返回对象,以便它可以写入HTTP响应。 假设“ErrorTO”是一个JAXB对象,然后返回的内容类型是application/xml。您应该在应用程序上下文中创建一个HandlerExceptionResolver,并配置一个支持application/xml内容类型的消息转换器(例如org.springframework.http.converter.xml.MarshallingHttpMessageConverter)。以下是一个例子:

@RequestMapping(value = "/testerror", method = RequestMethod.GET)
        public
        @ResponseBody
        ErrorTO testerror(HttpServletRequest request, HttpServletResponse response) {
           throw new RuntimeException("erorrrrrr");
        }

        @ExceptionHandler(RuntimeException.class)
        public @ResponseBody ErrorTO handlePoprocksExceptionAsReponseBody(RuntimeException ex,
               HttpServletRequest request, HttpServletResponse response) {
            response.setStatus(response.SC_BAD_REQUEST);
            return new ErrorTO(ex.getMessage(), -999);
        }

原来是一个bug,据说在3.1中已经修复

  <bean id="outboundExceptionAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver">
    <property name="messageConverters">
      <util:list>
        <ref bean="marshallingHttpMessageConverter"/>
      </util:list>
    </property>
  </bean>

  <bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <property name="marshaller" ref="jaxb2Marshaller" />
    <property name="unmarshaller" ref="jaxb2Marshaller" />
  </bean>

  <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.acme" />
  </bean>