diff --git a/hiver-admin/test-output/test-report.html b/hiver-admin/test-output/test-report.html index 9cee8d50..9092fcd1 100644 --- a/hiver-admin/test-output/test-report.html +++ b/hiver-admin/test-output/test-report.html @@ -35,7 +35,7 @@ Hiver
  • -三月 26, 2025 17:18:30 +三月 31, 2025 22:27:43
  • @@ -84,7 +84,7 @@

    passTest

    -

    17:18:30 下午 / 0.017 secs

    +

    22:27:44 下午 / 0.028 secs

    @@ -92,9 +92,9 @@
    #test-id=1
    passTest
    -03.26.2025 17:18:30 -03.26.2025 17:18:30 -0.017 secs +03.31.2025 22:27:44 +03.31.2025 22:27:44 +0.028 secs
    @@ -104,7 +104,7 @@ Pass - 17:18:30 + 22:27:44 Test passed @@ -128,13 +128,13 @@

    Started

    -

    三月 26, 2025 17:18:30

    +

    三月 31, 2025 22:27:43

    Ended

    -

    三月 26, 2025 17:18:30

    +

    三月 31, 2025 22:27:44

    diff --git a/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java b/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java index c3deb130..8af8ee37 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java +++ b/hiver-core/src/main/java/cc/hiver/core/common/utils/SecurityUtil.java @@ -23,12 +23,14 @@ import cc.hiver.core.vo.PermissionDTO; import cc.hiver.core.vo.RoleDTO; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.IdUtil; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -38,10 +40,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedHashSet; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -77,7 +76,10 @@ public class SecurityUtil { private MemberDao memberDao; @Autowired - private RedisTemplateHelper redisTemplate; + private RedisTemplateHelper redisTemplateHelper; + + @Autowired + private RedisTemplate redisTemplate; @Autowired private WorkerDao workerDao; @@ -88,6 +90,9 @@ public class SecurityUtil { @Autowired private LogisticsUserService logisticsUserService; + @Autowired + private ObjectMapper objectMapper; + /** * -------------------ToB------------------------- */ @@ -95,7 +100,7 @@ public class SecurityUtil { public User findUserByUsername(String username) { final String key = "username::" + username; // 璇诲彇缂撳瓨 - final String res = redisTemplate.get(key); + final String res = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(res)) { final Gson oldUser = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); return userToDTO(oldUser.fromJson(res, User.class)); @@ -103,30 +108,34 @@ public class SecurityUtil { final User user = userToDTO(userDao.findByUsername(username)); // 缂撳瓨 final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); - redisTemplate.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); return user; } public Worker findWorkerByUsername(String username) { final String key = "workername::" + username; // 璇诲彇缂撳瓨 - final String res = redisTemplate.get(key); + final String res = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(res)) { return new Gson().fromJson(res, Worker.class); } final Worker worker = workerDao.findByUsername(username); // 缂撳瓨 - redisTemplate.set(key, new Gson().toJson(worker), 15L, TimeUnit.DAYS); + redisTemplateHelper.set(key, new Gson().toJson(worker), 15L, TimeUnit.DAYS); return worker; } public LogiticsCompany findCompanyByUsername(String username) { final String key = "companyName::" + username; - // 璇诲彇缂撳瓨 - final String res = redisTemplate.get(key); - if (CharSequenceUtil.isNotBlank(res)) { - return new Gson().fromJson(res, LogiticsCompany.class); - } + // 鐩存帴浣跨敤 RedisTemplate 鑾峰彇瀵硅薄锛屼笉瑕佹墜鍔ㄥ弽搴忓垪鍖 + Object value = redisTemplate.opsForValue().get(key); + if (value instanceof LinkedHashMap) { + return objectMapper.convertValue(value, LogiticsCompany.class); + } + /*LogiticsCompany company = (LogiticsCompany) redisTemplate.opsForValue().get(key); + if (company != null) { + return company; + }*/ LogiticsCompany logiticsCompany = logiticsCompanyDao.findByUsername(username); // 濡傛灉娌℃湁鑾峰彇鍒帮紝閭d箞鍘绘悳绱㈠叕鍙稿憳宸ヤ俊鎭 if (logiticsCompany == null ) { @@ -145,7 +154,8 @@ public class SecurityUtil { } } // 缂撳瓨 - redisTemplate.set(key, new Gson().toJson(logiticsCompany), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + // redisTemplate.set(key, logiticsCompany, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplate.opsForValue().set(key, logiticsCompany, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); return logiticsCompany; } @@ -294,41 +304,41 @@ public class SecurityUtil { tokenUser = new TokenUser(user, tokenProperties.getStorePerms(), saved); // 鍗曡澶囩櫥褰 涔嬪墠鐨則oken澶辨晥 if (tokenProperties.getSdl()) { - final String oldToken = redisTemplate.get(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType()); + final String oldToken = redisTemplateHelper.get(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType()); if (CharSequenceUtil.isNotBlank(oldToken)) { - redisTemplate.delete(SecurityConstant.TOKEN_PRE + oldToken); + redisTemplateHelper.delete(SecurityConstant.TOKEN_PRE + oldToken); final String userTokenKey = SecurityConstant.TOKEN_PRE + oldToken; final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + oldToken + "type:"; - redisTemplate.delete(userTokenKey); - redisTemplate.delete(userTypeKey); + redisTemplateHelper.delete(userTokenKey); + redisTemplateHelper.delete(userTypeKey); // 搴楅摵鍙婂晢鍦 final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + oldToken + "shopId:"; final String regionKey = SecurityConstant.TOKEN_REGION + oldToken + "region:"; - redisTemplate.delete(shopIdKey); - redisTemplate.delete(regionKey); + redisTemplateHelper.delete(shopIdKey); + redisTemplateHelper.delete(regionKey); } } // 鏄惁璁颁綇璐﹀彿/淇濆瓨鐧诲綍 if (saved) { - redisTemplate.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); - redisTemplate.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); // 淇濆瓨褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹 final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:"; // 缂撳瓨 - redisTemplate.set(userTypeKey, user.getType(), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(userTypeKey, user.getType(), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); } else { - redisTemplate.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); - redisTemplate.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); + redisTemplateHelper.set(SecurityConstant.USER_TOKEN + user.getUsername() + "type:" + user.getType(), token, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); + redisTemplateHelper.set(SecurityConstant.TOKEN_PRE + token, new Gson().toJson(tokenUser), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); // 淇濆瓨褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹 final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:"; // 缂撳瓨 - redisTemplate.set(userTypeKey, user.getType(), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); + redisTemplateHelper.set(userTypeKey, user.getType(), tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES); } // 鏇存柊褰撳墠鐧诲綍浜虹殑瑙掕壊 final String key = "username::" + user.getUsername(); final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); - redisTemplate.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, gson.toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); } else { // JWT 涓嶇紦瀛樻潈闄 閬垮厤JWT闀垮害杩囬暱 tokenUser = new TokenUser(user, false, null); @@ -378,8 +388,8 @@ public class SecurityUtil { public LogiticsCompany getCurrCompany() { final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - boolean authenticated = authentication.isAuthenticated(); - String name = authentication.getName(); + final boolean authenticated = authentication.isAuthenticated(); + final String name = authentication.getName(); if (authentication == null || !authentication.isAuthenticated() || authentication.getName() == null || authentication instanceof AnonymousAuthenticationToken) { throw new HiverException("鏈娴嬪埌鐧诲綍鐢ㄦ埛"); @@ -427,7 +437,7 @@ public class SecurityUtil { final User u = getCurrUserSimple(); // 璇诲彇缂撳瓨 final String key = "userRole::depIds:" + u.getId(); - final String v = redisTemplate.get(key); + final String v = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(v)) { deparmentIds = new Gson().fromJson(v, new TypeToken>() { }.getType()); @@ -487,7 +497,7 @@ public class SecurityUtil { deparmentIds.clear(); deparmentIds.addAll(set); // 缂撳瓨 - redisTemplate.set(key, new Gson().toJson(deparmentIds), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, new Gson().toJson(deparmentIds), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); return deparmentIds; } @@ -532,13 +542,13 @@ public class SecurityUtil { public Member findMemberByMobile(String mobile) { final String key = "member::" + mobile; // 璇诲彇缂撳瓨 - final String res = redisTemplate.get(key); + final String res = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(res)) { return new Gson().fromJson(res, Member.class); } final Member member = memberDao.findByMobile(mobile); // 缂撳瓨 - redisTemplate.set(key, new Gson().toJson(member), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, new Gson().toJson(member), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); return member; } @@ -567,13 +577,13 @@ public class SecurityUtil { final String key = SecurityConstant.MEMBER_TOKEN + tokenMember.getUsername() + ':' + platform; // 鍗曞钩鍙扮櫥褰 涔嬪墠鐨則oken澶辨晥 if (appTokenProperties.getSpl()) { - final String oldToken = redisTemplate.get(key); + final String oldToken = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(oldToken)) { - redisTemplate.delete(SecurityConstant.TOKEN_MEMBER_PRE + oldToken); + redisTemplateHelper.delete(SecurityConstant.TOKEN_MEMBER_PRE + oldToken); } } - redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); - redisTemplate.set(SecurityConstant.TOKEN_MEMBER_PRE + token, new Gson().toJson(tokenMember), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); + redisTemplateHelper.set(SecurityConstant.TOKEN_MEMBER_PRE + token, new Gson().toJson(tokenMember), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); } else { // JWT tokenMember = new TokenMember(member, platform); @@ -651,13 +661,13 @@ public class SecurityUtil { final String key = SecurityConstant.WORKER_TOKEN + tokenWorker.getWorkerId() + ':' + tokenWorker.getWorkerName(); // 鍗曞钩鍙扮櫥褰 涔嬪墠鐨則oken澶辨晥 if (appTokenProperties.getSpl()) { - final String oldToken = redisTemplate.get(key); + final String oldToken = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(oldToken)) { - redisTemplate.delete(SecurityConstant.TOKEN_WORKER_PRE + oldToken); + redisTemplateHelper.delete(SecurityConstant.TOKEN_WORKER_PRE + oldToken); } } - redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); - redisTemplate.set(SecurityConstant.TOKEN_WORKER_PRE + token, new Gson().toJson(tokenWorker), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); + redisTemplateHelper.set(SecurityConstant.TOKEN_WORKER_PRE + token, new Gson().toJson(tokenWorker), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); } else { // JWT tokenWorker = new TokenWorker(worker, saved); @@ -719,13 +729,13 @@ public class SecurityUtil { final String key = SecurityConstant.COMPANY_TOKEN + tokenCompany.getId() + ':' + tokenCompany.getCompanyName(); // 鍗曞钩鍙扮櫥褰 涔嬪墠鐨則oken澶辨晥 if (appTokenProperties.getSpl()) { - final String oldToken = redisTemplate.get(key); + final String oldToken = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(oldToken)) { - redisTemplate.delete(SecurityConstant.TOKEN_COMPANY_PRE + oldToken); + redisTemplateHelper.delete(SecurityConstant.TOKEN_COMPANY_PRE + oldToken); } } - redisTemplate.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); - redisTemplate.set(SecurityConstant.TOKEN_COMPANY_PRE + token, new Gson().toJson(tokenCompany), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, token, appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); + redisTemplateHelper.set(SecurityConstant.TOKEN_COMPANY_PRE + token, new Gson().toJson(tokenCompany), appTokenProperties.getTokenExpireTime(), TimeUnit.DAYS); } else { // JWT tokenCompany = new TokenCompany(logiticsCompany, saved); @@ -756,13 +766,13 @@ public class SecurityUtil { public User findByUserNameAndType(String username, String type) { final String key = "username::" + username + "type:" + type; // 璇诲彇缂撳瓨 - final String res = redisTemplate.get(key); + final String res = redisTemplateHelper.get(key); if (CharSequenceUtil.isNotBlank(res)) { return userToDTO(new Gson().fromJson(res, User.class)); } final User user = userToDTO(userDao.findByUserNameAndType(username, type)); // 缂撳瓨 - redisTemplate.set(key, new Gson().toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(key, new Gson().toJson(user), tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); return user; } @@ -770,8 +780,8 @@ public class SecurityUtil { final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + token + "shopId:"; final String regionKey = SecurityConstant.TOKEN_REGION + token + "region:"; // 缂撳瓨 - redisTemplate.set(shopIdKey, shopId, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); - redisTemplate.set(regionKey, region, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(shopIdKey, shopId, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); + redisTemplateHelper.set(regionKey, region, tokenProperties.getSaveLoginTime(), TimeUnit.DAYS); } public String getShopId() { @@ -779,9 +789,9 @@ public class SecurityUtil { // 鑾峰彇璇锋眰token // 浠庣紦瀛樹腑鑾峰彇褰撳墠鐢ㄦ埛鐨剆hopId final String tokenKey = SecurityConstant.USER_TOKEN + u.getUsername() + "type:" + u.getType(); - final String token = redisTemplate.get(tokenKey); + final String token = redisTemplateHelper.get(tokenKey); final String shopIdKey = SecurityConstant.TOKEN_SHOP_ID + token + "shopId:"; - final String shopId = redisTemplate.get(shopIdKey); + final String shopId = redisTemplateHelper.get(shopIdKey); return shopId; } @@ -790,16 +800,16 @@ public class SecurityUtil { // 鑾峰彇璇锋眰token // 浠庣紦瀛樹腑鑾峰彇褰撳墠鐢ㄦ埛鐨剆hopId final String tokenKey = SecurityConstant.USER_TOKEN + u.getUsername() + "type:" + u.getType(); - final String token = redisTemplate.get(tokenKey); + final String token = redisTemplateHelper.get(tokenKey); final String regionKey = SecurityConstant.TOKEN_REGION + token + "region:"; - final String region = redisTemplate.get(regionKey); + final String region = redisTemplateHelper.get(regionKey); return region; } public String getLoginUserType(String token) { // 淇濆瓨褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹 final String userTypeKey = SecurityConstant.TOKEN_USER_TYPE + token + "type:"; - final String userType = redisTemplate.get(userTypeKey); + final String userType = redisTemplateHelper.get(userTypeKey); return userType; } } diff --git a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java index d7a207e0..bc5af36c 100644 --- a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java +++ b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java @@ -3,6 +3,8 @@ package cc.hiver.core.config.cache; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.Cache; @@ -14,82 +16,140 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import java.text.SimpleDateFormat; import java.time.Duration; +import java.util.TimeZone; /** - * Redis缂撳瓨 - * - * @author Yazhi Li + * Redis缂撳瓨閰嶇疆 + * 浼樺寲鍐呭锛 + * 1. 瀹屽杽鏃ユ湡搴忓垪鍖栧鐞 + * 2. 浼樺寲娉涘瀷浣跨敤 + * 3. 澧炲己寮傚父澶勭悊 + * 4. 鏀硅繘浠g爜鍙鎬 */ @Slf4j @Configuration public class RedisCacheConfig extends CachingConfigurerSupport { + + private static final String CACHE_ERROR_PREFIX = "Redis缂撳瓨鎿嶄綔寮傚父 - "; + @Value("${hiver.cache.timeToLive:-1}") private Duration timeToLive; /** - * 鑷畾涔夊簭鍒楀寲鏂瑰紡 - * - * @param factory - * @return + * 鑷畾涔夌紦瀛樼鐞嗗櫒 + * 浼樺寲鐐癸細 + * 1. 浣跨敤娉涘瀷鏄庣‘鎸囧畾搴忓垪鍖栫被鍨 + * 2. 閰嶇疆瀹屾暣鐨凧ackson搴忓垪鍖栬鍒 + * 3. 鏀寔Java8鏃ユ湡鏃堕棿绫诲瀷 */ @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { - RedisSerializer redisSerializer = new StringRedisSerializer(); - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + // Key搴忓垪鍖栧櫒 + RedisSerializer keySerializer = new StringRedisSerializer(); - // 瑙e喅鏌ヨ缂撳瓨杞崲寮傚父鐨勯棶棰 - ObjectMapper om = new ObjectMapper(); - om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - om.activateDefaultTyping(new ObjectMapper().getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); - jackson2JsonRedisSerializer.setObjectMapper(om); + // Value搴忓垪鍖栧櫒 + Jackson2JsonRedisSerializer valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class); - // 閰嶇疆搴忓垪鍖栵紙瑙e喅涔辩爜鐨勯棶棰橈級 + // 閰嶇疆ObjectMapper + ObjectMapper objectMapper = createObjectMapper(); + log.info("ObjectMapper鏃ユ湡鏍煎紡閰嶇疆: {}", objectMapper.getDateFormat()); + valueSerializer.setObjectMapper(objectMapper); + + // 缂撳瓨閰嶇疆 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) - .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) - .disableCachingNullValues(); + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer)) + .disableCachingNullValues() + .entryTtl(timeToLive); - RedisCacheManager cacheManager = RedisCacheManager.builder(factory) - .cacheDefaults(config.entryTtl(timeToLive)) + return RedisCacheManager.builder(factory) + .cacheDefaults(config) + .transactionAware() // 鏀寔浜嬪姟 .build(); - return cacheManager; } /** - * 寮傚父澶勭悊 褰揜edis缂撳瓨鐩稿叧鎿嶄綔鍙戠敓寮傚父鏃 鎵撳嵃鏃ュ織 绋嬪簭姝e父璧 - * - * @return + * 鍒涘缓骞堕厤缃甇bjectMapper + */ + private ObjectMapper createObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + // 璁剧疆鍙鎬 + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 鏀寔澶氭佺被鍨 + mapper.activateDefaultTyping( + mapper.getPolymorphicTypeValidator(), + ObjectMapper.DefaultTyping.NON_FINAL); + // 绂佺敤鏃ユ湡鏃堕棿鎴虫牸寮 + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + // 娉ㄥ唽Java8鏃ユ湡鏃堕棿妯″潡 + mapper.registerModule(new JavaTimeModule()); + return mapper; + } + + /** + * 缂撳瓨寮傚父澶勭悊鍣 + * 浼樺寲鐐癸細 + * 1. 鏇磋缁嗙殑閿欒鏃ュ織 + * 2. 缁熶竴閿欒鍓嶇紑 */ @Override public CacheErrorHandler errorHandler() { - CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() { + return new CacheErrorHandler() { @Override public void handleCacheGetError(RuntimeException e, Cache cache, Object key) { - log.warn("Redis occur handleCacheGetError锛歬ey: [{}]", key); + log.error(CACHE_ERROR_PREFIX + "鑾峰彇缂撳瓨澶辫触 - 缂撳瓨鍚嶇О:[{}], 閿:[{}], 閿欒:[{}]", + cache.getName(), key, e.getMessage(), e); } @Override public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) { - - log.warn("Redis occur handleCachePutError锛歬ey: [{}]锛泇alue: [{}]", key, value); + log.error(CACHE_ERROR_PREFIX + "鍐欏叆缂撳瓨澶辫触 - 缂撳瓨鍚嶇О:[{}], 閿:[{}], 鍊肩被鍨:[{}], 閿欒:[{}]", + cache.getName(), key, + value != null ? value.getClass().getSimpleName() : "null", + e.getMessage(), e); } @Override public void handleCacheEvictError(RuntimeException e, Cache cache, Object key) { - log.warn("Redis occur handleCacheEvictError锛歬ey: [{}]", key); + log.error(CACHE_ERROR_PREFIX + "娓呴櫎缂撳瓨椤瑰け璐 - 缂撳瓨鍚嶇О:[{}], 閿:[{}], 閿欒:[{}]", + cache.getName(), key, e.getMessage(), e); } @Override public void handleCacheClearError(RuntimeException e, Cache cache) { - log.warn("Redis occur handleCacheClearError"); + log.error(CACHE_ERROR_PREFIX + "娓呯┖缂撳瓨澶辫触 - 缂撳瓨鍚嶇О:[{}], 閿欒:[{}]", + cache.getName(), e.getMessage(), e); } }; - return cacheErrorHandler; } -} + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + + // 浣跨敤Jackson搴忓垪鍖栧櫒 + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); + + // 閰嶇疆ObjectMapper + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); + serializer.setObjectMapper(objectMapper); + + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + template.afterPropertiesSet(); + return template; + } +} \ No newline at end of file diff --git a/hiver-core/src/main/resources/mapper/LogisticsAddressBookMapper.xml b/hiver-core/src/main/resources/mapper/LogisticsAddressBookMapper.xml index e1cb3b00..a6e84e20 100644 --- a/hiver-core/src/main/resources/mapper/LogisticsAddressBookMapper.xml +++ b/hiver-core/src/main/resources/mapper/LogisticsAddressBookMapper.xml @@ -185,7 +185,7 @@ select from t_logistics_address_book - where company_id = #{queryParams.companyId} + where company_id = #{companyId} ORDER BY create_time desc diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java index 6f3660d8..3fc9f969 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java @@ -1269,14 +1269,14 @@ public class AliOcrUtil { final StringJoiner shipperQuestionMsgStr = new StringJoiner(","); final StringBuilder receiverQuestionMsg = new StringBuilder("鍙戣揣浜哄垪琛細"); final StringJoiner receiverQuestionMsgStr = new StringJoiner(","); - if (!shipperLogisticsAddressBooks.isEmpty()) { + if (shipperLogisticsAddressBooks != null && !shipperLogisticsAddressBooks.isEmpty()) { // shipperLogisticsAddressBooks 杞楀彿鍒嗛殧瀛楃涓 for (LogisticsAddressBook shipperLogisticsAddressBook : shipperLogisticsAddressBooks) { shipperQuestionMsgStr.add(shipperLogisticsAddressBook.getShipperOrReceiverName()); } shipperQuestionMsg.append(shipperQuestionMsgStr); } - if (!receiverLogisticsAddressBooks.isEmpty()) { + if (receiverLogisticsAddressBooks != null && !receiverLogisticsAddressBooks.isEmpty()) { for (LogisticsAddressBook shipperLogisticsAddressBook : receiverLogisticsAddressBooks) { receiverQuestionMsgStr.add(shipperLogisticsAddressBook.getShipperOrReceiverName()); }