- 先上图
- 基于Restful模式,目前单次数据请求考虑解决两个问题
- 用户验证
- 分页处理
- 用户权限认证由TokenInterceptor拦截,用户登陆后后台返回一串密钥,这个密钥由JavaJsonWebToken生成,密钥由生成时间、用户名、权限等组成。客户发送请求必须携带密钥,通过密钥过滤接口的访问权限
- 系统使用Mybatis作为持久层框架,之前分页参数都是int start,int end,String order,String sort。比较原始且不方便,所以考虑在此基础封装一层方便使用。在设计时希望Controller可以直接接受到分页对象、并且根据实际数据库的不同给予不同的封装。(这个还没完成)
- 因此在使用了装饰模式,定义了Pagination接口,抽象类AbastractPagination,与三个实现类OraclePagination,MySqlPagination,SqlServerPagination
- 实现HanlderMethodArgumentResolver,重写supportsParamter、resolveArgument实现分页对象的传递
- PaginationResolver
/** * 分页参数解析器 * @author shadow * @create 2017-12-14 * {@link} */ public class PaginationResolver implements HandlerMethodArgumentResolver { /** * 分页接口的实现类 默认为Oracle分页 */ private Class<? extends Pagination> paginationType = OraclePagination.class; /** * * 判断参数是否为 {@link Pagination}的实现类 */ @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType() == Pagination.class; } /** * TODO 待优化 根据实际数据库类型自动映射 * 根据数据库类型给予正确的分页参数 */ @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); Pagination page = (Pagination) ObjectUtils.setPoperties(paginationType, request, null); page.init(); return page; } public Class<? extends Pagination> getPaginationType() { return paginationType; } public void setPaginationType(Class<? extends Pagination> paginationType) { this.paginationType = paginationType; } }