对象序列化转换异常
nested exception is java.lang.ClassCastException: com.atguigu.common.vo.MemberRespVo cannot be cast to com.atguigu.common.vo.MemberRespVo
发生在拦截器的
MemberRespVo attribute = (MemberRespVo) request.getSession().getAttribute(AuthServerConstant.LOGIN_USER);
用下面的方法神奇班解决了
MemberRespVo attribute = JSON.parseObject(JSON.toJSONString(request.getSession().getAttribute(AuthServerConstant.LOGIN_USER)),MemberRespVo.class);
新将object转为json字符串,然后再转成MemberRespVo.class
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.yfxu.common.utils.PageUtils
通过转成字符串后,再转成对象
日期java.util.Date的反序列化
JSON parse error: Cannot deserialize value of type java.util.Date
from String “2021-03-24T16:00:00.000Z”
这个问题主要在前端的日期格式,和后端Jackson配置的日期格式不对应
# 格式化响应给前端的date
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
修改下前端代码,指定下日期值的格式
<el-form-item label="活动开始时间">
<el-date-picker
type="datetime"
placeholder="举办时间"
value-format="yyyy-MM-dd HH:mm:ss"
v-model="lec.organize.hostTime"
></el-date-picker>
</el-form-item>
不报错了但是,后端变量hostTime收到的长这样:Fri Mar 12 07:00:00 CST 2021但是吧不影响和数据库中相应字段比较.表现形式不一样,他们还是相等的
补充:如果不配置Jackson日期格式的话,可参考解决参考link
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
private Date hostTime;
Could not deserialize: autoType is not support. org.springframework.web.servlet.FlashMap;
问题出在redirectAttributes.addFlashAttribute(“errors”, errors);当注册字段出现问题,将errors通过该方法放在session中(以FlashMap 实体的形式),以便重定向新页面显示错误信息.
工程配置了session-redis,该数据会存储在redis中,且序列化方式被配置为GenericFastJsonRedisSerializer.然后重定向新页面就
org.springframework.data.redis.serializer.SerializationException: Could not deserialize: autoType is not support. org.springframework.web.servlet.FlashMap; nested exception is com.alibaba.fastjson.JSONException: autoType is not support. org.springframework.web.servlet.FlashMap
at com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer.deserialize(GenericFastJsonRedisSerializer.java:37) ~[fastjson-1.2.59.jar:na]
PS:暂时还没想到什么办法解决
将各个config/GulimallSessionConfig.java中的Redis序列化器更改成Jackson的
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
// 使用Jackson提供的转换器
// return new GenericFastJsonRedisSerializer();
return new GenericJackson2JsonRedisSerializer();
}
远程调用异常
Feign远程调用的请求方式:@RequestMapping 或者 @PostMapping
feign.FeignException$MethodNotAllowed: [405] during [GET] to [http://lecture-product/product/lecorganize/listByIds] [ProductFeignService#listByIds(List)]: [{“timestamp”:“2021-01-29T12:40:35.488+0000”,“status”:405,“error”:“Method Not Allowed”,"
进行远程调用时,原本想法是通过GET方法,获取数据,但是那不得有理有据,那我就给点数据吧.对方用@RequestBody接收,殊不知这是接收请求体的数据,通常get是不支持接受请求体数据的,结果给了个@GetMapping那不得错的透透的.改成@RequestMapping 或者 @PostMapping方可
java.lang.NoSuchMethodException: java.util.List.()
远程调用时,要用to对象接受,传输过来的json
Feign远程调用的请求头丢失、异步编排上下文丢失问题
详细link
shiro中同样可以这般解决丢失问题
feign远程调用时会出现没有请求属性的情况
Caused by: feign.RetryableException: cannot retry due to redirection, in streaming mode executing GE
定时任务, mq监听器 这二者的请求不是直接来自浏览器,故没有请求属性(不能获取到请求头或者cookie中的sessionId),所以在调用前的拦截器没做处理,在远程服务中需要给该请求放行,要不没登录得重定向(此时错误就发生在这)
在添加老请求头时会出现空指针问题. 在远程服务中放开shiro对该请求的认证.
@Configuration
public class FeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
//1.RequestContextHolder拿到刚进来的这个请求
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes == null) { //这个么由于定时任务, 对mq监听器 不是直接来自浏览器(没有请求属性) 调用远程这会出问题
return;
}
HttpServletRequest request = attributes.getRequest();//老请求
//从header获取
String sessionId = request.getHeader("Authorization");
System.out.println("feign远程header中的sessionId:"+sessionId);
if (StringUtils.isEmpty(sessionId)) {
//从Cookie中获取
sessionId = request.getHeader("Cookie");
}
//给新请求同步老请求的cookie
requestTemplate.header("Authorization", sessionId);
// System.out.println("feign远程之前先进行RequestInterceptor.apply");
}
};
}
}
数据库Dao异常
Mybatis表中没主键字段保存不上
当初建了一个关联表,就没给主键,然后Iservice的save(T)与BaseMapper里的insert(T),保存实体类时,roleId字段都丢失了
但直接运行sql就好使
insert ums_user_role_relation values (1,"超级管理",23,"lucky")
问题在这,自动生成代码时给第一个字段变成了@TableId,去掉应该就可以了
/**
* 关联的角色id
*/
@TableId
private Integer roleId;
当下策略要么自己实现下,要么价格主键id
Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘item_entities‘ in ‘field list‘
正常来说不在原始生成的entity里添加字段来着,用新建vo的方式,今天还是犯错了
暂且先直接手动添加个非表字段排除注解
@TableField(exist = false)
private List<OrderItemEntity> itemEntities;
框架配置异常
spring-cloud-gateway启动冲突报错
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method modifyRequestBodyGatewayFilterFactory in
org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of
type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' in your configuration.
错误解决方法:参考link
将pom.xml中关于spring-boot-start-web模块的jar依赖去掉。
<dependency>
<groupId>com.yfxu.lecture</groupId>
<artifactId>lecture-common</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除该依赖要不与网关冲突报错-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
spring-cache的@CacheEvict标注在内部方法不起作用
参考link
/home/xu/PersonProjects/renren_lecture/lecture/lecture-seckill/src/main/java/com/yfxu/lecture/seckill/service/impl/SeckillServiceImpl.java
@Override
@CacheEvict(value = {"appointment"}, key = "'getAppointmentInfoList'") //缓存更新,失效模式
public void upSeckillSku(Integer days,boolean forceFlag) {
...
this.uploadSeckillSkuLatestSomeDay(days,forceFlag);
...
}
//@CacheEvict放在这个内部方法上是不起作用的
public void uploadSeckillSkuLatestSomeDay(Integer days,boolean forceFlag) throws NoAppoinmentInfoException {
...
}
Java下经典操作
List<Guest> guestList = r.getData("data", new TypeReference<List<Guest>>() {});
Map<Long, Guest> guestMap = guestList.stream().collect(Collectors.toMap(Guest::getLecId, guest -> guest));
格式化响应给前端的date日期
# 格式化响应给前端的date
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
其它
Error:(34, 23) java: expected
private String abstract; 变量命名结果用了人家关键字啊啊
大HashMap结构及存储优化
考虑到Entry的对象头 以及 会对基本数据类型进行包装成对象
结构优化:link
存储方式:可考虑放在直接内存
开启压缩:类型指针 普通对象指针