实战经验之谈
1 背景
虽然经历了数不清日夜的加班加点,然而开发技能与收入却都还在原地踏步。觉醒吧,势必日复一日的单调生活中闯出一条血路。
尽管成功学不在少数,但真正适合自己的却很少。以下内容均为经验之谈,如果对大家有所帮助,请不吝点赞。
2 技术方面
2.1 坚决不抛5xx响应码
无论是前端、测试还是领导,只要看到接口报500之类的异常,第一个想法就是把这个接口的开发打一顿。尽管从规范来讲,接口存在异常确实应该抛出500。但是为了不背锅,请将500响应修改为200。实在给出提示信息,请使用自定义响应码。
使用@exceptionHandler注解统一处理异常,并将@ResponseStatus值设为200。具体代码如下所示:
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(value = {Exception.class})
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public Object defaultHandler(HttpServletResponse response,Exception e) throws JsonProcessingException {
log.error(e.getMessage(),e);
response.setContentType("application/json;charset=UTF-8");
if(e instanceof PSQLException
|| e instanceof PersistenceException
|| e instanceof MyBatisSystemException
|| e instanceof BadSqlGrammarException){
return ResultObject.exception(1,"内部错误:数据库操作失败");
}
if(e instanceof HttpHostConnectException
|| e instanceof RetryableException){
return ResultObject.exception(1,"连接失败:请检查第三方系统接入状态");
}
return ResultObject.exception(1,"未知错误,请联系管理员");
}
}
2.2 版本问题
只要是在做开发,毫无疑问都会遇到版本大坑。这里的话,只能说给出两点比较实用的建议。
2.2.1 拒绝引入重复依赖
为什么要提到这一点?无他,被坑过。举个例子:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
表面上没什么问题,但是一运行起来就会报错 找不到相关类。仔细看一下依赖关系就会发现spring-boot-starter-amqp里面已经包含了amqp-client,也就是说前者依赖于后者。然后呢?你又引入了一个独立版本的amqp-client将前者内部的依赖的amqp-client覆盖掉了,导致前者实际运行报错。
就这样一个简单的东西,很多人包括一些讲师也重复在犯错,实在是不应该。
正确的做法是,只引入必须的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
2.2.2 固定版本,构建starter
实际开发过程中最好是固定依赖版本,等真正出了问题再升级版本。而固定版本一个比较好用的办法,就是构建自定义starter。
2.2.2.1 构建步骤
-
新建springboot项目,引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
-
新建properties包,里面设置自定义配置
@ConfigurationProperties(value = "datasource.config") public class DataSourceProperties { private String prefix; private String suffix; private String enable; public String getEnable() { return enable; } public void setEnable(String enable) { this.enable = enable; } public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } }
-
新建META-INF,添加properties里面的文件到factory.properties中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ xyz.yq56.sdk.config.DataSourceConfig,\ xyz.yq56.sdk.config.Swagger2Config
-
maven中install即可,然后其他项目可以通过坐标直接引入
2.2.2.2 使用:引入依赖即可
- starter项目结构
- 使用方法
3 学习方面
3.1 有关顺序
对应Java开发而言,学习资料遍地都是。单纯b站上面的教学视频,就已经消化不过来。然而人的时间和精力却是有限的,那么问题来了?到底先学什么后学什么。
以本人经验来说,务必事先研究工作中常用的技术栈。比如说,工作中你经常打交道的是ES和Kafka,那么就优先学习这两个。优点有如下几点:
- 常用技术栈的坑更容易遇到,提前研究它就不怕踩坑
- 实践机会多,学起来更容易,也更有成就感
3.2 有关方法
多年学习经验,当然不能一出校门就抛诸脑后。总结起来,有这么几点:
- 考核不能少:对学校记忆最深的,肯定有考试这一项。考核有助于了解自己的状态,确定增长方向
- 结果导向:学习的时候,就该想到这东西要怎么输出出来。无论学什么东西,最终一定要体现在项目中
- 迭代总结:勤写博客,定期迭代博客。
- 教学视频优先于书籍:书籍尽管比较严谨,但是对于知识吸收很不友好。视频所见即所得,能快速构建技术与结果之间的联系,是一种更好的学习方式。推荐有视频,则先学视频。视频没有的,再从书籍中吸收
3.3 有关时间
时间问题无法回避,也是很多人放弃学习的最常用借口之一。出了校门之后,整段的学习时间的确是非常难得。但是时间挤挤总是有的,通勤过程中就可以反复对自己提问,加深技术理解。
4 关注招聘
尽管你最近不想跳槽,也请你关注招聘信息。从招聘要求,我们可以很快的得知该学些什么。另外,也需要频繁的更新简历。只有在更新简历的时候,你才能明白过去的日子到底有没有荒废。