我正在开发一个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。
答案 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();
}
}