Skip to content

Commit cfcb4af

Browse files
authored
Merge pull request #86 from Boyuan-IT-Club/Red_Moon
启用ObjectMapper的默认类型处理功能,确保对象能够正确地序列化和反序列化。
2 parents 990dae4 + 43e6986 commit cfcb4af

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/main/java/club/boyuan/official/config/RedisConfig.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,14 @@ public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisC
2222
// 使用StringRedisSerializer序列化和反序列化key值
2323
template.setKeySerializer(new StringRedisSerializer());
2424

25-
// 配置ObjectMapper以支持Java 8时间类型
25+
// 配置ObjectMapper以支持Java 8时间类型和类型信息
2626
ObjectMapper objectMapper = new ObjectMapper();
2727
objectMapper.registerModule(new JavaTimeModule());
2828
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
29+
// 启用类型信息存储,以便正确反序列化对象
30+
objectMapper.activateDefaultTyping(
31+
objectMapper.getPolymorphicTypeValidator(),
32+
ObjectMapper.DefaultTyping.NON_FINAL);
2933

3034
// 使用GenericJackson2JsonRedisSerializer序列化和反序列化value值
3135
template.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));

src/main/java/club/boyuan/official/service/impl/ResumeFieldDefinitionServiceImpl.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import club.boyuan.official.mapper.ResumeFieldValueMapper;
88
import club.boyuan.official.service.IResumeFieldDefinitionService;
99
import lombok.AllArgsConstructor;
10-
import org.apache.ibatis.session.ExecutorType;
1110
import org.apache.ibatis.session.SqlSession;
1211
import org.apache.ibatis.session.SqlSessionFactory;
1312
import org.slf4j.Logger;
@@ -17,6 +16,7 @@
1716

1817
import java.time.LocalDateTime;
1918
import java.util.List;
19+
import java.util.Map;
2020
import java.util.concurrent.TimeUnit;
2121

2222
@Service
@@ -47,14 +47,22 @@ public ResumeFieldDefinition getFieldDefinitionById(Integer fieldId) {
4747
try {
4848
// 尝试从Redis缓存中获取数据
4949
String cacheKey = "field_definition:" + fieldId;
50-
ResumeFieldDefinition cachedDefinition = (ResumeFieldDefinition) redisTemplate.opsForValue().get(cacheKey);
50+
Object cachedObject = redisTemplate.opsForValue().get(cacheKey);
5151

52-
if (cachedDefinition != null) {
53-
logger.debug("从Redis缓存中获取到字段定义,字段ID: {}", fieldId);
54-
return cachedDefinition;
52+
if (cachedObject != null) {
53+
// 检查缓存对象类型并进行适当转换
54+
if (cachedObject instanceof ResumeFieldDefinition) {
55+
logger.debug("从Redis缓存中获取到字段定义,字段ID: {}", fieldId);
56+
return (ResumeFieldDefinition) cachedObject;
57+
} else if (cachedObject instanceof Map) {
58+
// 如果是Map类型,尝试手动转换
59+
logger.debug("从Redis缓存中获取到字段定义Map,字段ID: {}", fieldId);
60+
// 由于复杂的类型转换可能出错,我们选择直接从数据库查询
61+
logger.debug("缓存中对象类型不匹配,将从数据库重新查询");
62+
}
5563
}
5664

57-
// 缓存未命中,从数据库查询
65+
// 缓存未命中或类型不匹配,从数据库查询
5866
ResumeFieldDefinition definition = resumeFieldDefinitionMapper.findById(fieldId);
5967

6068
// 将查询结果存入Redis缓存,设置过期时间为1小时
@@ -106,7 +114,7 @@ public ResumeFieldDefinition updateFieldDefinition(ResumeFieldDefinition fieldDe
106114
@Override
107115
public List<ResumeFieldDefinition> batchUpdateFieldDefinitions(List<ResumeFieldDefinition> fieldDefinitions) {
108116
logger.info("批量更新简历字段定义,字段数量: {}", fieldDefinitions.size());
109-
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
117+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
110118
ResumeFieldDefinitionMapper batchMapper = sqlSession.getMapper(ResumeFieldDefinitionMapper.class);
111119

112120
// 批量更新字段定义

0 commit comments

Comments
 (0)