确保Web服务处理异常并始终返回有效响应

时间:2013-05-20 00:32:51

标签: java web-services model-view-controller spring-mvc

我正在开发一个Web服务,无论如何,响应应始终有效,我的意思是有效格式。

这意味着如果Web服务需要返回与特定XSD架构匹配的XML,那么它应该总是返回一个有效的XML文档,无论如何。

到目前为止,我唯一的方法是做这样的事情(在控制器级别)

String xmlResponse = this.loadDefaultXML();
try {
     xmlResponse = this.myCoolService.myCoolMethod();
} catch (Throwable t) {
     xmlResponse = this.loadDefaultXML(String errorMessage)
} finally {
     return xmlResponse
}

当然lpoadDefaultXML()将加载xml文档,如:

<?xml>
<result>Ouch, there was a problem</result>

loadDefaultXML(String errorMessage)会做

<?xml>
<result>WHATEVER errorMessage contains</result>

当然,服务级别会处理正常的异常,但我觉得抓住Throwable并使用try-catch-finally是唯一可以确保无论如何都能控制的方法所以我总能返回一个XML。

有更好的想法或建议吗?

更新

我正在使用Spring MVC 3.2和JAXB进行xml的编组/解组。 这确实使用了SOAP,我也没有使用wsdl。

1 个答案:

答案 0 :(得分:2)

Spring MVC 中,当在处理请求期间抛出异常时,DispatcherServlet将查询配置的org.springframework.web.servlet.HandlerExceptionResolver以处理抛出的异常。然后,解析器可以转换 视图以向用户显示。

简而言之,要使用它,您可以:

  • 实施HandlerExceptionResolver界面,这只是实施resolveException(Exception, Handler)方法并返回ModelAndView的问题。

或者,我更喜欢:

  • 在控制器中使用@ExceptionHandler方法注释指定在执行控制器方法期间抛出特定类型的异常时调用哪个方法。例如:

    @Controller
    public class PersonController {
    
        @RequestMapping("person/{id}")
        @ResponseBody
        public Person getById(@PathVariable String id) {
            if ("007".equals(id)) {
                throw new RuntimeException("007 is a secret agent.");
            }
            return personService.getById(id);
        }
    
        @ExceptionHandler(RuntimeException.class) // this can be an array
        @ResponseBody
        public String handleRuntimeException(RuntimeException ex,
                                             HttpServletRequest request) {
            return "Oops! Something bad happened: "+ex.getMessage();
        }
    }
    

Web MVC framework - Handling Exceptions找到更多信息。