一个基于 Spring Boot 的项目骨架

本文介绍了如何在Java项目中进行统一的异常处理,包括不同类型的异常处理策略,以及代码生成器用于简化基础代码的创建。同时提到提供接口签名认证和一套完整的Java学习资源,旨在帮助开发者提升技能和准备面试。
摘要由CSDN通过智能技术生成

public static Result genSuccessResult(Object data) {

returnnew Result()

.setCode(ResultCode.SUCCESS)

.setMessage(DEFAULT_SUCCESS_MESSAGE)

.setData(data);

}

public static Result genFailResult(String message) {

returnnew Result()

.setCode(ResultCode.FAIL)

.setMessage(message);

}

}

统一异常处理

public void configureHandlerExceptionResolvers(List exceptionResolvers) {

exceptionResolvers.add(new HandlerExceptionResolver() {

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {

Result result = new Result();

if (e instanceof ServiceException) {//业务失败的异常,如“账号或密码错误”

result.setCode(ResultCode.FAIL).setMessage(e.getMessage());

logger.info(e.getMessage());

} elseif (e instanceof NoHandlerFoundException) {

result.setCode(ResultCode.NOT_FOUND).setMessage(“接口 [” + request.getRequestURI() + “] 不存在”);

} elseif (e instanceof ServletException) {

result.setCode(ResultCode.FAIL).setMessage(e.getMessage());

} else {

result.setCode(ResultCode.INTERNAL_SERVER_ERROR).setMessage(“接口 [” + request.getRequestURI() + “] 内部错误,请联系管理员”);

String message;

if (handler instanceof HandlerMethod) {

HandlerMethod handlerMethod = (HandlerMethod) handler;

message = String.format(“接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s”,

request.getRequestURI(),

handlerMethod.getBean().getClass().getName(),

handlerMethod.getMethod().getName(),

e.getMessage());

} else {

message = e.getMessage();

}

logger.error(message, e);

}

responseResult(response, result);

returnnew ModelAndView();

}

});

}

常用基础方法抽象封装

publicinterface Service {

void save(T model);//持久化

void save(List models);//批量持久化

void deleteById(Integer id);//通过主鍵刪除

void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4”

void update(T model);//更新

T findById(Integer id);//通过ID查找

T findBy(String fieldName, Object value) throws TooManyResultsException; //通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束

List findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4”

List findByCondition(Condition condition);//根据条件查找

List findAll();//获取所有

}

提供代码生成器来生成基础代码

publicabstractclass CodeGenerator {

public static void main(String[] args) {

genCode(“输入表名”);

}

public static void genCode(String… tableNames) {

for (String tableName : tableNames) {

//根据需求生成,不需要的注掉,模板有问题的话可以自己修改。

genModelAndMapper(tableName);

genService(tableName);

genController(tableName);

}

}

}

CodeGenerator 可根据表名生成对应的Model、Mapper、MapperXML、Service、ServiceImpl、Controller(默认提供POST和RESTful两套Controller模板,根据需要在 genController(tableName)方法中自己选择,默认是纯POST的),代码模板可根据实际项目的需求来定制,以便渐少重复劳动。

由于每个公司业务都不太一样,所以只提供了一些简单的通用方法模板,主要是提供一个思路来减少重复代码的编写。在我们公司的实际使用中,其实根据业务的抽象编写了大量的代码模板。

提供简单的接口签名认证

public void addInterceptors(InterceptorRegistry registry) {

//接口签名认证拦截器,该签名认证比较简单,实际项目中可以使用Json Web Token或其他更好的方式替代。

if (!“dev”.equals(env)) { //开发环境忽略签名认证

registry.addInterceptor(new HandlerInterceptorAdapter() {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//验证签名

boolean pass = validateSign(request);

if (pass) {

returntrue;

} else {

logger.warn(“签名认证失败,请求接口:{},请求IP:{},请求参数:{}”,

request.getRequestURI(), getIpAddress(request), JSON.toJSONString(request.getParameterMap()));

Result result = new Result();

result.setCode(ResultCode.UNAUTHORIZED).setMessage(“签名认证失败”);

responseResult(response, result);

returnfalse;

}

}

});

}

}

/**

  • 一个简单的签名认证,规则:

    1. 将请求参数按ascii码排序
    1. 拼接为a=value&b=value…这样的字符串(不包含sign)
    1. 混合密钥(secret)进行md5获得签名,与请求的签名进行比较

*/

private boolean validateSign(HttpServletRequest request) {

String requestSign = request.getParameter(“sign”);//获得请求签名,如sign=19e907700db7ad91318424a97c54ed57

if (StringUtils.isEmpty(requestSign)) {

returnfalse;

}

List keys = new ArrayList(request.getParameterMap().keySet());

keys.remove(“sign”);//排除sign参数

Collections.sort(keys);//排序

StringBuilder sb = new StringBuilder();

for (String key : keys) {

sb.append(key).append(“=”).append(request.getParameter(key)).append(“&”);//拼接字符串

}

String linkString = sb.toString();

linkString = StringUtils.substring(linkString, 0, linkString.length() - 1);//去除最后一个’&’

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

[外链图片转存中…(img-wn7DINjq-1712264236203)]

[外链图片转存中…(img-B8eSqYwl-1712264236203)]

[外链图片转存中…(img-HYiJvUNs-1712264236203)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值