Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保web服务处理异常并始终返回有效响应_Java_Web Services_Model View Controller_Spring Mvc - Fatal编程技术网

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

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> 当然,服务级别会考虑正常的异常,但是,我觉得

我正在开发一个web服务,不管发生什么,响应都应该是有效的,我的意思是以有效的格式有效

这意味着,如果期望web服务返回与特定XSD模式匹配的XML,则无论发生什么情况,它都应始终返回有效的XML文档

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

当然,
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();
    }
}