1

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

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

4

1 回答 1

2

Spring MVC中,当处理请求的过程中抛出异常时,DispatcherServlet会参考配置org.springframework.web.servlet.HandlerExceptionResolver的 s 来处理抛出的异常。然后,解析器可以将异常转换为向用户显示的视图

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

  • 实现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 框架 - 处理异常中查找更多信息。

于 2013-05-20T03:11:40.133 回答