【问题标题】:Ensure that web service handles exceptions and always returns a valid response确保 Web 服务处理异常并始终返回有效响应
【发布时间】:2013-05-20 00:32:51
【问题描述】:

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

这意味着,如果希望 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。

【问题讨论】:

  • 你的是一个好方法,但我相信最好的方法是使用你的框架的能力。哪一个?有些将允许您创建处理Throwable 的异常映射器类(将它们转换为XML 消息)。其他人只会让你捕捉“业务异常”(即他们不会让你处理ThrowableException),在这种情况下,你是唯一的方法。
  • @acdcjunior 查看更新,谢谢 :)
  • 这是一个 SOAP 服务,还是别的什么?
  • 不是 SOAP,只是简单的 xml 请求/响应。

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


【解决方案1】:

Spring MVC中,当处理请求时抛出异常,DispatcherServlet会参考配置的org.springframework.web.servlet.HandlerExceptionResolvers来处理抛出的异常。然后解析器可以将异常翻译视图以显示给用户。

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

  • 实现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 查找更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多