您正在查看标签:java 下的文章

Spring Cache @Cacheable 缓存在部分Service中不生效的解决办法

作者: StoneWu  |  时间: 2021-01-22 18:24:27  |  
分类: JAVA开发  |  1 条评论  |  2330 次浏览

一、背景

最近开发的项目中,需要大量的使用到缓存以提升性能

其中,有个活动controller,需要查询所有的活动,代码如下:

    @GetMapping("/list")
    public RestResult<List<ActivityInfoDTO>> list() {
        List<ActivityInfoDTO> list = activityService.getAllActivity();
        return addRestResult(list);
    }

对应的ActivityService方法如下:

    @Override
    @Cacheable(value = "ActivityInfoDTO", key = "'getAllActivity'")
    public List<ActivityInfoDTO> getAllActivity() {
        List<ActivityInfoDTO> allActivity = activityDefMapper.getAllActivity();
        return allActivity;
    }

结构十分简单,但是奇怪的是,ActivityService里的方法完全不会走缓存

而另一个service,BannerInfoService则可以正常缓存

调试时可以看到,正常的BannerInfoService是有被cglib代理的,如下图:

而ActivityService是没有被代理的

二、解决方法

漫长的搜索过后,没能在网上找到解决方案

最终将目光瞄向了ActivityService的其他引用,于是猜测是否是循环引用导致ActivityService没有被代理

mybatis使用collection标签进行树形结构数据查询时如何携带外部参数查询

作者: StoneWu  |  时间: 2019-11-01 16:36:06  |  
分类: JAVA开发  |  0 条评论  |  713 次浏览

1、背景

最近更新博客的评论功能,想实现这么一个需求:

评论使用树形结构展示,评论提交后,需要后台审核后才展示到前台,但是用户自己可以显示自己提交的未审核的评论,效果如下:

上面的审核中的评论是当前用户发的,下面的是其他用户发的审核通过的

2、实施

最初的实现方法是想使用collection进行树形结构查询

为了实现树形查询,需要两个resultMap,一个为最外层的查询结果,另一个是集合里的查询结果,也就是对象中的children对应的List,因为是树形结构,所以外层和里层的结构基本一样,下方代码为两个resultMap代码(示例):

Java在ElasticSearch中使用LocalDatetime类型

作者: StoneWu  |  时间: 2020-09-11 11:32:05  |  
分类: JAVA开发  |  0 条评论  |  758 次浏览

问题


最近在开发一个搜索功能的需求的时候,遇到了LocalDatetime类型不能保存到ElasticSearch中的问题,报错如下:

ElasticsearchStatusException[Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [createTime] of type [date] in document with id '3000']
]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_state_exception, reason=Can't get text on a START_OBJECT at 1:125]];

经过


从网上查找尝试第一个办法:

将以下注解加到时间字段上,依然无效

@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true,
        format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss.SSS")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd HH:mm:ss.SSS")
private LocalDateTime createTime;

 

解决办法


在项目中添加以下依赖:

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

在字段上加上以下注解

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@Field(type = FieldType.Date, store = true, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss.SSS")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSS")
private LocalDateTime createTime;

完美解决

JAVA使用腾讯企业邮箱发送邮件时报错Could not connect to SMTP host

作者: StoneWu  |  时间: 2019-11-04 17:40:06  |  
分类: JAVA开发  |  0 条评论  |  1175 次浏览

最近做一个邮件发送功能的时候,发现腾讯企业邮的邮箱,用java发送邮件的时候一直报错:

Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465, response: -1

发邮件使用的spring-boot-starter-mail,配置文件如下:

# 设置邮箱主机
spring.mail.host=smtp.exmail.qq.com
spring.mail.port=465
spring.mail.protocol=smtp

# 设置用户名
spring.mail.username=xxxxxx
# 设置密码,是客户端专用密码,非网页登录密码
spring.mail.password=xxxxxx

# true代表邮箱需要认证
spring.mail.properties.mail.smtp.auth=true

#启用SSL
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

查阅各种资料后发现,配置文件应当加入下面的配置:

spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.port=465
spring.mail.properties.mail.smtp.socketFactory.port=465

将这三行加入到配置文件里就可以正常发送邮件了

新版博客上线啦!!

作者: StoneWu  |  时间: 2019-09-19 23:37:22  |  
分类: 开发日记  |  0 条评论  |  302 次浏览

(mō)(yú)了一个月后,新版的博客终于做完了

新版博客把三年前用的spring mvc+spring。。等等一大堆的框架,切换成了更为优雅的spring boot,说是切换,其实就是重写了。。TAT。

原来用起来反人类的后台管理也换成了基于vue+element-ui的前端框架,用起来顺滑多了,感觉自己写文章的动力都变大了呢(并不

而且终于成功注册到了这个新域名stonewu.com,旧域名可能明年就不会再续费了吧哈哈哈哈哈哈哈

博客的前台交互也改善了很多,不过可能没有旧版博客的兼容性好,新版大概只能兼容IE10+了

不过现在还有一些小细节还需要优化下,慢慢来吧。

现在全站上了CDN,是之前阿里云学生认证免费送的20G,俩年前就送了,可惜现在才用上,年底就要到期了,果然人只有失去的时候才懂得珍惜

以后还是得养成写文章的习惯,有的时候好多想法,想分享出来的时候看到旧版的写作界面就没有欲望了。

好了就酱

Spring Boot 使用 spring-boot-devtools 实现热加载时出现类型转换异常

作者: StoneWu  |  时间: 2018-10-10 18:14:47  |  
分类: JAVA开发  |  0 条评论  |  365 次浏览

近期有开始一个新项目的开发,项目使用Spring Boot + Dubbo + MyBatis plus等其他框架开发,就不细讲,这篇文章主要是记录下解决热加载的问题

 

网上有给出了许多解决热加载的方法,比如:

在resource目录下创建META-INF/spring-devtools.properties文件

里面的内容为类似下面的内容:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

网上能给出的答案一般也就这些,可是作为观众我们自然是表示一脸懵逼啊,这两行啥玩意?

 

那么现在给出下我的解决办法:

现在大部分的项目在eclipse中基本都是多个项目的形式,在intellij idea中则是多个module的形式

我使用的是eclipse,项目的结构大概如下图(精简版):

其中,web项目引用了faced项目,没有引用service项目,因为service项目是个独立的dubbo provider(提供者),web项目则为consumer(消费者)

 

web项目中的controller中有这么一行代码:

UserInfo info = userService.findInfo();

其中UserInfo来自faced项目,userService则通过dubbo的reference注入

项目引入spring-boot-devtools了以后,如果改动了web项目中的代码,则下次web项目中运行到了上面这行代码,则会出现如下报错

java.lang.ClassCastException: com.xxx.UserInfo cannot be cast to com.xxx.UserInfo

为啥明明显示的是同一个类,却给我显示类型转换异常?

那么这就要从spring-boot-devtools的工作原理说起

spring-boot-devtools的热加载其实是这么工作的

当你启动web项目的时候,你的web项目中的代码都会交给spring-boot-devtools的restart加载器去进行加载,而jar包,则基本会交给base加载器去加载

当项目中的代码有改动时,devtools检测到代码变动,restart加载器就会被扔掉重建,这个时候,所有restart加载器加载的代码都会重新部署,而base加载器则维持不变

因为jar包的内容基本都不会变,所以用base加载器不会有什么问题

但是由于web项目中引用了faced项目,于是你引用的faced的所有代码也会被restart加载器重新加载,此时,刚刚加载的UserInfo则跟项目刚开始启动的UserInfo就是两个类了,java中判断两个类是否为同一个类不仅仅是通过包名+类名去识别,还会去看两个类的加载器是否一致,如果不一致,则识别为两个类,所以就会出现我们之前看到的转换异常

那么解决办法呢?

首先我们需要确定我们出现转换异常的类在哪个项目中,我的则是platform-faced项目

那么回到最初的方法,我们需要在resource目录下创建META-INF/spring-devtools.properties文件

里面的内容填写:

restart.exclude.faced=/platform-faced

如果你有多个face项目,且项目名开头都是这个,那么可以使用如下的配置

restart.exclude.faced=/platform-faced[\\w-]+

网上给的答案后面有带上.jar,但是由于我们开发的时候的引用方式是项目引用,后面是不带jar的,所以我们不需要带上.jar

restart.exclude.faced这个键中的faced是可以自己命名的,只需要保证在这个配置文件中唯一即可

文件配置好后,我们可以在项目已启动状态下修改web项目中的代码,可以看到控制台有显示项目重新加载,继续访问到之前触发转换异常的地方,发现已经不会异常了,完美!