Java 确保web服务处理异常并始终返回有效响应
我正在开发一个web服务,不管发生什么,响应都应该是有效的,我的意思是以有效的格式有效 这意味着,如果期望web服务返回与特定XSD模式匹配的XML,则无论发生什么情况,它都应始终返回有效的XML文档 到目前为止,我唯一的方法就是这样做(在控制器级别) 当然,Java 确保web服务处理异常并始终返回有效响应,java,web-services,model-view-controller,spring-mvc,Java,Web Services,Model View Controller,Spring Mvc,我正在开发一个web服务,不管发生什么,响应都应该是有效的,我的意思是以有效的格式有效 这意味着,如果期望web服务返回与特定XSD模式匹配的XML,则无论发生什么情况,它都应始终返回有效的XML文档 到目前为止,我唯一的方法就是这样做(在控制器级别) 当然,lpoadDefaultXML()将加载如下xml文档: <?xml> <result>Ouch, there was a problem</result> 当然,服务级别会考虑正常的异常,但是,我觉得
lpoadDefaultXML()
将加载如下xml文档:
<?xml>
<result>Ouch, there was a problem</result>
当然,服务级别会考虑正常的异常,但是,我觉得捕获Throwable
并使用try-catch-finally
是确保无论发生什么情况,我都能控制的唯一方法,这样我就可以始终返回XML
有更好的想法或建议吗
更新:
我使用SpringMVC3.2和JAXB对xml进行编组/解编。
在Spring MVC中,当在处理请求期间引发异常时,
DispatcherServlet
将参考配置的org.springframework.web.servlet.HandlerExceptionResolver
来处理引发的异常。然后,解析器可以将异常转换为视图,以向用户显示
简而言之,要使用它,您可以:
- 实现
接口,这只是实现HandlerExceptionResolver
方法并返回resolveException(异常,处理程序)
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(); } }
查看更多信息。您的方法很好,但我认为最好的方法是使用您的框架功能。是哪一个?有些将允许您创建一个异常映射器类,该类处理可丢弃的(将它们转换为XML消息)。其他人只允许您捕获“业务异常”(也就是说,他们不允许您处理
可丢弃的
或异常
),在这种情况下,您的异常是唯一的方法。@acdcjunior查看更新,谢谢:)这是一个SOAP服务还是其他服务?不是SOAP,只是简单的xml请求/响应。
<?xml>
<result>WHATEVER errorMessage contains</result>
@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();
}
}