ssm开发经历汇总

1、@webfilter注解配置的filter中用到某个bean

自定义的filter需要实现filter接口,并重写init()、doFilter()、destroy()方法

因为spring框架是先加载filter类,再加载其他bean,所以,若在自定义filter中的bean采用自动装配方法(@Autowired)或者是在init()方法中调用(ApplicationContext) context.getBean(),此时的bean由于还没有开始加载,所以filter中的对bean的引用为Null, 若在之后的doFilter()中调用该bean的方法,将会抛出NullPointerException异常;

解决方案:对bean的装配在调用时才进行装配,因为所有调用需在所有bean实例化之后才能进行。所以待使用时配备bean,此时的bean已经加载完成,能通过(ApplicationContext) context.getBean()获得该bean的唯一实例。

 

2、ip过滤问题

在写ip过滤代码后,需要使用多个ip进行过滤测试,第一个想到的是用docker容器,因为docker能方便地产生多个容器,且会自动为不同容器分配的唯一ip,这样满足多个ip测试代码的需求。

但是,容器内程序访问外部地址时需要进行NAT转换,外部程序是无法访问容器ip的,容器的ip相当于对内网ip的再分配,它们对外的源地址ip统一为宿主机的ip,只不过每一个容器ip对应不同的服务端口。这样,就不能满足多ip测试的需求了。

 

3、发包和接包(HTTP请求)工具

进行后端开发工作,最常做的事情当然是发包和接包了,如果有图形界面的话,Postman无疑是个很好的选择。

但是,如果没有图形界面的环境,比如,需要在docker容器中进行发包和接包,curl命令则非常好用。

若发送post请求,格式为curl -X POST url ( PS: 其实get和post在url中都可以携带明文请求参数 ) -d "query1=what&query2=what..." (这是POST请求的非明文请求参数);

如果想用POST发送JSON文件请求,需要加上命令参数 -H "Content-Type:application/json" , POST的请求格式也变成JSON格式;

例如,curl -H "Content-Type:application/json" -X POST http://localhost:8080/api/city?query1=test1&query2=test2&query3=test3 -d '{ "id":"3", "provinceId":"3", "cityName":"zhuhai", "description":"live in zhuhai"}'

 

4、Windows下使用docker挂载数据卷

主要是解决Windows下目录绝对路径中的反斜杠在linux命令行中无法识别的问题和冒号对命令参数载入的干扰;

冒号问题:$ docker run --name gcc_container -v E:\Users\docker\data:/var/test -i -t gcc

反斜杠问题:$ docker run --name gcc_container --mount type=bind,source=E:\\Users\\docker\\data,target=/var/test -i -t gcc

解决方案:$ docker run --name gcc_container -v /e/Users/docker/data:/var/test -i -t gcc (×)      提示bind source path does not exist

 

5、用RestTemplate进行客户端对服务器的请求

当用RestTemplate进行客户端对服务器的请求时,对RequestEntity和ResponseEntity包含的实体,若请求或者返回的JSON报文字段与其属性非一一对应(例如,有残缺),则抛出异常。

解决方案:在实体类上加注解@JsonInclude(value=JsonInclude.Include.NON_NULL),这样,当json报文中没有对应的值赋值给实体的属性时,该实体属性被赋值null,不会抛出异常。

 

6、关于删除

对于一个实际营业的项目,所有数据只能进行逻辑删除,不能物理删除。逻辑删除只是修改了记录在数据库中的状态位,方便前端确定是否显示记录,但后期仍可跟踪记录、排查问题(删除可能由系统异常导致,由人工干预导致等)。

关于删除操作,可能会专门创建一个删除表记录。这样做的目的是,用户(或其他)可能存在重复删除同一订单的操作,当删除记录被加入删除表后,可在删除前先查询删除表中是否已经存在删除记录,防止重复提交删除。为什么不直接查询原纪录的状态位判断是否已经逻辑删除呢?原因是(带状态)记录可能存在于其他服务器,本地拿不到,查询操作又要进行一次远程数据交换,若将删除表存储在本地数据库,则可免去一次远程请求。

 

7、关于@Value注解的使用

@Value是spring框架的内容,只有那些由spring创建的实例(bean),@Value注解提供的值才能注入bean中的属性,而由new创建的实例,即使属性被@Value修饰,其值仍为null。

 

8、工具类的构建

任何一个工具类方法的入参的相关判断都应该在该方法中进行,而不是把参数的必要判断放在方法体之外,因为下一次工具方法的使用位置不确定,但要保证工具方法的健壮性,即无论什么入参,对该工具方法的调用都不会抛出异常。

 

9、防止空指针异常

任何从数据库获取的数据在与其它变量进行比较或者利用setter方法对属性赋值前,应该先判断该数据是否真正从数据库成功获得,即判断该数据是否为Null,例,1 == null 就会抛出空指针异常问题。

对于判断是否等值的问题,有另一个安全的方法是用Objects.equals(a,b)方法进行比较,该方法可以避免与Null作比较造成空指针异常的问题。

 

10、仓储运输提高效率的方法

一品多件>多品多件>按单

两道把关提高拣选效率:订单拦截暂存,优先级算法,组播算法。

 

posted @ 2019-08-23 11:54  thePacer  阅读(418)  评论(0编辑  收藏  举报