Java下bug经历汇总

对象序列化转换异常

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

存储方式:可考虑放在直接内存

开启压缩:类型指针 普通对象指针

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空•物语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值