这部分的代码在
http://git.oschina.net/terrymanu/miracle-framework/tree/master/miraclesea/framework-webmvc
这个部分写的比较晚了,本来是设计的时候应该写的,但是因为当时写这个项目的时候,还没想好需要往这个模块中放什么。现在随着rbac模块的开发,渐渐的想到了一些可以提取出来的东西。
目前第一版,只支持rest api,以后会考虑支持freemarker。
1. 首先是一个流程。基本的CRUD都有一些标准流程。
如,增加一个实体的时候,首先要validate这个实体,其次通过业务方法从数据库中查询,判断这个实体是否打破了业务规则(如:唯一的用户名),如果失败,则返回相应的错误代码,如果成功。则返回正确的。
2. 基于这个流程,需要定义一个BaseResponse,用于封装Http状态码和业务对象。springmvc虽然提供了ResponseEntity,但是并没有可以放入error以及warn的地方。所以需要扩展一下。
所以现在新增加了两个包,com.miraclesea.webmvc.vo,用于存放BaseResponse;com.miraclesea.webmvc.controller用于存放模板逻辑。
其中核心的代码在AsyncBaseMangementController这个类中。提供了模板以及回调的接口。代码如下:
public abstract class AsyncBaseMangementController<T> {
public final ResponseEntity<BaseResponse<T>> add(final T entity, final BindingResult result, final MvcCallback callback) {
BaseResponse<T> response = new BaseResponse<T>();
if (result.hasErrors()) {
for (ObjectError error : result.getAllErrors()) {
response.getErrors().add(ResponseFeedback.builder().code(error.getCodes()[0]).build());
}
return new ResponseEntity<BaseResponse<T>>(response, HttpStatus.UNPROCESSABLE_ENTITY);
}
try {
callback.execute();
} catch (final DataIntegrityViolationException ex) {
response.getErrors().add(ResponseFeedback.builder().code(ex.getKey()).build());
return new ResponseEntity<BaseResponse<T>>(response, HttpStatus.CONFLICT);
}
return new ResponseEntity<BaseResponse<T>>(response, HttpStatus.CREATED);
}
}
现在有一些问题未确定。如果是创建成功,返回201,这个是没问题的。如果创建失败,验证失败返回422,资源冲突返回409,这两个有点拿不准。如果哪位熟悉http协议请告知,非常感谢。
另外定义了一个回调接口,业务方法就写在这个回调接口中。
修改和删除未完待续
来源:oschina
链接:https://my.oschina.net/u/719192/blog/177256