云栖息地编号信息:[点击查看更多行业信息]
在这里,您可以找到来自不同行业的第一手云信息。你还在等什么?来吧。
前言
最近,Spring Boot已经被用来与MyBatis、通用的Mapper插件和PageHelper分页插件在几个中小型API项目中合作。在这样做之后,我认为用这套框架和工具来开发这种项目真的很舒服,团队的反应也很好。在项目的建设和发展过程中,我也总结了一些小经验,并与大家分享。
在开发一个API项目之前,不言而喻,构建项目、引入依赖关系和配置框架的基本任务是自然的。通常,为了加快项目的开发进度(提前回家),需要封装一些常用的类和工具,如统一响应结果封装、统一异常处理、接口签名认证、基本添加、删除、修改和差异方法封装、基本代码生成工具等。只有有了这些项目,项目才能启动。
但是,下次完成类似的项目时,可能需要重复上述步骤。虽然它通常被接管和改变,但仍然是浪费时间。因此,面向对象的抽象和封装的思想可以用来提取这些项目的共同点,并将它们封装到一个种子项目中(据估计,大多数公司将会有许多类似的种子项目)。这样,下次开发类似的项目并直接迭代种子项目就足够了,从而减少了无意义的重复工作。
在相关项目上线后,我花了一些时间来简化种子项目,并且已经与GitHub共享了该项目。如果你准备做类似的项目,你可以试着克隆它。
如果你发现问题或有任何好的建议,请询问问题或公关一起改进。
特征提供
最佳实践项目结构、配置文件、简化的项目管理
统一的响应结果封装和生成工具
/**
*统一的应用编程接口响应结果包
*/
公共类结果
私有int代码;
私有字符串消息;
私有对象数据;
公共结果集代码(结果代码结果代码){
this . code=ResultCode . code;
归还这个;
}
//省略getter和setter方法
}
/**
*响应代码枚举,参考HTTP状态代码的语义
*/
公共枚举结果代码{
成功(200),//成功
失败(400),//失败
未自动化(401),//未认证(签名错误)
找不到(404),//接口不存在
内部_服务器_错误(500);//服务器内部错误
公共int代码;
结果代码(内部代码){
this.code=code
}
}
/**
*响应结果生成工具
*/
公共类结果生成器{
私有静态最终字符串DEFAULT _ SUCCESS _ MEssage= ' SUCCESS ';
公共静态结果genSuccessResult() {
返回新结果()。设置代码(结果代码。成功)。设置消息(DEFAULT _ SUCCESS _ MEssage);
}
公共静态结果生成成功结果(对象数据){
返回新结果()。设置代码(结果代码。成功)。设置消息(DEFAULT_SUCCESS_MESSAGE)。setData(数据);
}
公共静态结果生成失败结果(字符串消息){
返回新结果()。设置代码(结果代码。失败)。setMessage(消息);
}
}
统一异常处理
公共void ConfigureHandlerExceptionResolver(ListHandlerExceptionResolver ExceptionResolver){
exceptionResolvers . add(new HandlerExceptionResolver(){
公共模型和视图解析异常(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,异常e) {
结果结果=新结果();
如果(serviceexception的实例){//业务失败的异常,例如“错误的帐户或密码”
result.setCode(结果代码。失败)。setMessage(e . GetMessage());
logger . info(e . GetMessage());
}否则如果(例如NoHandlerFoundException) {
results . set code(result code . not _ found)。setmessage( ' interface[' request . getrequesturi()']不存在 ');
}否则如果(例如ServletException) {
result.setCode(结果代码。失败)。setMessage(e . GetMessage());
}其他{
结果。setcode(结果代码。内部服务器错误)。setmessage( ' interface[' request . GetRequestUri() ']内部错误,请联系管理员 ');
字符串消息;
if(handler instance of handler method){
句柄方法句柄方法=(HandlerMethod)句柄;
消息=字符串。格式( '接口[%s]出现异常,方法:%s.%s,异常摘要:%s ',
request.getRequestURI(),
handlerMethod.getBean().getClass().getName(),
handlerMethod.getMethod().getName(),
e .GetMessage());
}其他{
message=e . GetMessage();
}
logger.error(消息,e);
}
响应结果(响应,结果);
返回新模型和视图();
}
});
}
常用基础方法抽象封装
公共接口服务
无效保存(T型);//持久化
无效保存(列表模型);//批量持久化
void deleteById(整数id);//通过主鍵刪除
void deleteByIds(字符串ids//批量刪除例如:ids - "1,2,3,4 "
空洞更新(T型);//更新
T findById(整数id);//通过编号查找
查找方式(字符串字段名,对象值)抛出TooManyResultsException//通过模型中某个成员变量名称(非数据表中圆柱的名称)查找,值需符合独一无二的约束
列表查找标识(字符串标识);//通过多个编号查找//eg:ids - "1,2,3,4 "
列表查找条件(条件条件);//根据条件查找
列表查找全部();//获取所有
}
提供代码生成器来生成基础代码
公共抽象类代码生成器{
.
公共静态空主要(字符串[)参数){
genCode( '输入表名 ');
}
公共静态无效生成代码(字符串.表名){
用于(字符串表名:表名){
//根据需求生成,不需要的注掉,模板有问题的话可以自己修改。
genModelAndMapper(表名);
发电服务(表名);
通用控制器(表名);
}
}
.
}
代码生成器可根据表名生成对应的模型、映射器、映射XML、服务、服务接口、控制器(默认提供开机自检和安静的两套控制器模板,根据需要在通用控制器(表名)方法中自己选择,默认是纯开机自检的),代码模板可根据实际项目的需求来定制,以便渐少重复劳动。
由于每个公司业务都不太一样,所以只提供了一些简单的通用方法模板,主要是提供一个思路来减少重复代码的编写。在我们公司的实际使用中,其实根据业务的抽象编写了大量的代码模板。扩展用户用户:优秀的代码都是如何分层的?
提供简单的接口签名认证
公共无效的附加接收器(截取注册注册表){
//接口签名认证拦截器,该签名认证比较简单,实际项目中可以使用Json网络令牌或其他更好的方式替代。
如果(!'dev ' .等于(环境)){ //开发环境忽略签名认证
注册表。addinterceptor(新HandlerInterceptorAdapter(){
@覆盖
公共布尔预句柄(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)引发异常{
//验证签名
布尔传递=有效符号(请求);
如果(通过)
返回真;
}其他{
logger.warn( '签名认证失败,请求接口:{},请求知识产权:{},请求参数:{} ',
request.getRequestURI(),GetPaddress(request),JSON。到字符串(请求。getParameterMap());
结果结果=新结果();
result.setCode(结果代码。未经授权).setMessage( s)签名认证失败 ');
响应结果(响应,结果);
返回错误的
}
}
});
}
}
/**
*一个简单的签名认证,规则用户用户:
* 1 .将请求参数按美国信息交换标准码码排序
* 2 .拼接为a=值b=值.这样的字符串(不包含标志)
* 3 .混合密钥(秘密)进行讯息摘要5获得签名,与请求的签名进行比较
*/
私有布尔验证签名(HttpserVletrequest请求){
字符串RequestSign=请求。GetParameter( '符号 ');//获得请求签名,如符号=19e 907700 db7 ad 91318424 a 97 c 54 ed 57
if(StringItls。ISempty(RequestSign)){
返回错误的
}
列表字符串键=新的数组字符串(request.getParameterMap().密钥集();
钥匙。移除( ' sign ');//排除符号参数
Collections .排序(键);//排序
StringBuilder sb=新的StringBuilder();
用于(字符串键:键){
追加(钥匙).追加('= ').追加(request.getParameter(键)).追加( ' ');//拼接字符串
}
字符串链接字符串某人。ToString();
链接字符串=字符串。子字符串(链接字符串,0,链接字符串。长度()-1);//去除最后一个' '
字符串机密= '马铃薯 '。//密钥,自己修改
字符串符号=DigestUtils.md5Hex(链接字符串机密);//混合密钥md5
返回StringUtils.equals(符号,RequestSign);//比较
}
集成MyBatis、通用映射器插件、页面助手分页插件实现单表业务零SQL
使用Druid Spring启动程序集成Druid数据库连接池和监控
利用FastJsonHttpMessageConverter提高JSON序列化速度
技术选型文档
[云起在线教室]产品和技术专家每天分享!
课程地址:https://yqh.aliyun.com/live
立即加入社区,与专家面对面,并了解课程的最新进展!
[云栖在线课堂社区]https://c.tb.cn/F3.Z8gvnK
发布者:2020-04-14
作者:简单土豆
本文来源于“互联网建筑师微信公众号”。如果你知道相关信息,你可以关注“互联网建筑师”
发表评论