2022年9月学习记录
-
- 一、@Cacheable注解不生效问题——2022-07-29
- 二、Mybatis映射文件 *DAO.xml中调用内部类——2022-08-06
- 三、在thymeleaf解析的html中将错误代码注释后还是报错——2022-08-08
- 四、导入xxl-sso项目的<pofiles>标签内的<plugins>爆红——2022-08-16
- 五、Java8在lambda表达式中使用变量报错(Java8引入的特性,访问变量 ,默认final)
- 六、整合xxl-sso项目时Filter类获取的URL是IP地址而不是域名
- 七、远程Feign接口声明正常的情况下调用报错
- 八、调用远程Feign接口时丢失请求头导致远程服务无法获取登录状态
- 九、在@Configuration中注入交换机,路由和队列等Bean实例时,使用RabbitMQ的后台发现交换机,路由,队列等没有被创建!
- 十、版本0.9.0的Seata框架进行批量插入报错
- 十一、thymeleaf模块的Controller返回字符串`listOrder`无法找到templates下的`listOrder.html`文件
一、@Cacheable注解不生效问题——2022-07-29
1、遇到的两种@Cacheable修饰的方法缓存没有生效的情况
(1)直接通过new创建@Cacheable注解修饰方法所在的类
- @Cacheable方法所在的类必须交由Spring管理,可通过注解@Conponent修饰类,给调用该缓存方法的类添加@ComponentScan注解以便能扫描到。此外也可以通过其他方法让Spring管理该类。
(2)方法A调同一个类里的另一个有缓存注解的方法B,这样是不走缓存的。
- 不使用注解的方式,直接取 Ehcache 的 CacheManger 对象,把需要缓存的数据放到里面,类似于使用 Map,缓存的逻辑自己控制;或者不使用@Cacheable直接使用redis的缓存方式去添加缓存;
- 把方法A和方法B放到两个不同的类里面;
2、@Cacheable 的一些注意点
- 因为@Cacheable 由AOP 实现,所以,如果该方法被其它注解切入,当缓存命中的时候,则其它注解不能正常切入并执行,@Before 也不行,当缓存没有命中的时候,其它注解可以正常工作
- 因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法,这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理,不会走代理,就不能正常创建缓存,所以每次都需要去调用数据库。
二、Mybatis映射文件 *DAO.xml中调用内部类——2022-08-06
调用内部类提示找不到
假如B是A的内部类,在*DAO.xml文件中调用类B时,需写成com.XXX.A$B
, 注意A类和B类之间用$
表示内外关系,而不是常用的.
点号。
错误写法
正确写法
三、在thymeleaf解析的html中将错误代码注释后还是报错——2022-08-08
1、问题描述
如代码[[${val.attrValue}]]
因为有解析错误等问题需要暂时注释掉,但是加上注释后<!-- [[${val.attrValue}]]-->
后发现val.attrValue还是能够被thymeleaf解析
2、原因分析
测试如下代码,其中hasStock的值为boolean类型
<!--[[${item.hasStock}]]-->
<!--${item.hasStock}-->
[[${item.hasStock}]]
经thmeleaf的解析结果如下,可以看到<!-- -->
内的有[[ ]]
符号修饰的SPEL表达式是正常解析了的:
<!--false-->
<!--${item.hasStock}-->
false
3、小结
[[ ]]
之间的表达式在Thymeleaf中被认为是内联表达式,在其中使用任何类型的表达式都会有效,即无论怎样都会被解析,甚至加上注释符号<!-- -->
都能解析,所有对类似于<!-- [[${val.attrValue}]]-->
的代码注释时,需要去掉[[ ]]
,写成<!-- ${val.attrValue}-->
;否则如果想将有解析错误的代码注释后仍然会报解析错误。
四、导入xxl-sso项目的标签内的爆红——2022-08-16
1、解决方法
爆红是因为<pofiles>标签下的<plugins>插件无法下载,把<plugins>复制到与<pofiles>标签同层的<build>标签内就可以正常下载插件了
,下载完后可以删除外层<build>标签下的<plugins>,<pofiles>标签下的<plugins>插件不会再爆红。(注意:<plugins>标签是<build>标签的子标签
)
2、疑惑点
目前对pom.xml下的<pofiles>标签理解不深,只是简单了解<pofiles>标签主要用于多环境部署,用<pofile>下的<id>属性来标识不同开发生产环境。按<pofiles>标签的职能来说idea应该会下载<pofiles>下的<plugins>资源啊!毕竟<dependencies>依赖能正常下载
3、SpringBoot使用profiles实现多环境配置
1.maven配置
配置maven中的 profiles 属性,分为开发环境 dev、生产环境 prod 以及测试环境 test
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<environment>prod</environment>
</properties>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties