SpringMVC3 rest服务 相关知识点记录

本文介绍了使用Spring MVC进行RESTful Web服务开发时的关键异常处理技巧,包括全局异常捕捉、JSON输出及404错误处理。
最近重新回头做j2ee开发,之前一直是struts。既然重新开始做j2ee,怎么也要有点新花样。

于是就研究springmvc的rest来做web service。


其他没什么,主要是记录一下以下的几个关键知识点。

由于是web服务,出现异常必然不可能返回页面给调用者,于是捕捉封装异常成了必然。

于是几个学习点:全局异常捕捉,json方式输出,404的处理。

1.全局异常捕捉:

自己实现一个HandlerExceptionResolver,然后写到配置文件中
比如:

public class RestServiceExceptionHandler extends
DefaultHandlerExceptionResolver{}


同时controller内部也有注解的异常处理。这边有一个异常优先级关系。可以把注解配置的噶一些,这个看个人项目。


2. 404的处理

配置完以后发现有一些默认的404错误还是不会被捕捉到,直接就被spring的dispatchServlet给处理掉了。比如很简单的如下定义的controller的方法:


@ResponseBody
@RequestMapping("/movie/add")
public Object addMovie(
@RequestParam(value="a") String movieName,
@RequestParam(value="b") String movieDirector,
){

this.LOGGER.info("> add date success! <");
Map<String,Object> dataMap = new HashMap<String, Object>();
return dataMap;
}


因为@RequestParam 需要两个参数

如果不小心漏了一个参数,比如:输入了 这样的/xxxxx/movie/add?a=1 路径,那肯定是希望返回json提示,但是结果是直接给我一个404的jsp页面。。。


处理方法:写一个默认的controller来捕捉所有的路径:


@Controller
public class DefaultNoMappingController {
@RequestMapping("/**")
public void unmappedRequest(HttpServletRequest request) {
String uri = request.getRequestURI();
throw new RestServiceException("资源不存在 " + uri,RestErrorCode.uri_not_found.getValue());
}

}



3.json方式输出

直接在doResolveException方法里输出了,网上貌似例子很多。。我随便找了个就用了。不知道算不算正统。。

errorConverter 为异常的转化对象,就是接收异常转化成系统自定义的错误类。


protected ModelAndView doResolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {

RestError error = errorResolver.resolveError(request, handler, ex);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
ObjectMapper mapper = new ObjectMapper();

try {
JsonGenerator jsonGenerator = mapper.getJsonFactory()
.createJsonGenerator(response.getOutputStream(),
JsonEncoding.UTF8);
mapper.writeValue(jsonGenerator, errorConverter.convert(error));
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return new ModelAndView();
}




基本上写下来发现最搞不清楚的还是404那块,当时一直不知道怎么处理,甚至于我都想到要复写dispatchServlet了,后来找到老外的一个rest的异常框架,终于了解了。。

老外的那个东东:

介绍:
http://www.stormpath.com/blog/spring-mvc-rest-exception-handling-best-practices-part-1

代码下载:
https://github.com/stormpath/spring-mvc-rest-exhandler

另外最后有一个问题没想通,请看到这个文章并且了解的人解惑:

就是像我那样直接用 response.write来输出json字串和 老外那样用ContentNegotiatingViewResolver配置来输出json 有什么本质区别??

感觉是直接写response.write来输出方便啊,谢谢。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值