-
Notifications
You must be signed in to change notification settings - Fork 496
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BUG] 空List反序列化后向其中添加元素时报java.lang.UnsupportedOperationException异常 #1835
Comments
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.41-SNAPSHOT/ |
@wenshao 此问题在 2.0.42以及以后版本又出现了 |
从42-45版本都有这个问题 |
@cycle2zhou 新版本的异常信息能提供下么? |
温少,这是我们升级
|
Page的类结构可以提供下么? |
温少,这个问题调整后已修复 @wenshao 先前使用 package basic.model;
import lombok.Data;
import org.springframework.util.CollectionUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 分页模型
*/
@Data
public class Page<T> implements Serializable {
private static final long serialVersionUID = 201612008194101999L;
/**
* 页面元素
*/
// 有问题
private List<T> data = Collections.emptyList();
// 修复正常
// private List<T> data = new ArrayList<>();
/**
* 当前页码
*/
private Integer pageIndex = 0;
/**
* 每页展示数
*/
private Integer pageSize = 0;
/**
* 总页码
*/
private Integer totalPage = 0;
/**
* 总数
*/
private Long total = 0L;
/**
* 构建
*/
public static <T> Page<T> of (List<T> data, Integer pageIndex, Integer pageSize, Long total) {
Page<T> page = new Page<>();
page.setData(data);
page.setPageIndex(pageIndex);
page.setPageSize(pageSize);
page.setTotal(total);
page.setTotalPage(total, pageSize);
return page;
}
@Deprecated
public void setData(List<T> items) {
if (CollectionUtils.isEmpty(items)) {
return;
}
this.data = items.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
/**
* 设置总页数
*
* @param total 总数
* @param pageSize 分页大小
*/
@Deprecated
public void setTotalPage (Long total, Integer pageSize) {
this.total = total;
this.pageSize = pageSize;
if (total == null || total == 0) {
return;
}
if (pageSize == null || pageSize == 0) {
return;
}
int totalPage;
if (0 == total % pageSize)
totalPage = (int) (total / pageSize);
else
totalPage = (int) (total / pageSize + 1);
if(0==totalPage)
totalPage = 1;
this.totalPage = totalPage;
}
} |
问题无法重现,能够调试看下序列化之前这个Page里面的data是什么类型么?或者调试反序列化报错UnsupportedOperationException时当前List的类型 |
温少,data是 package basic.model;
import lombok.Data;
import org.springframework.util.CollectionUtils;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 分页模型
*/
@Data
public class Page<T> implements Serializable {
private static final long serialVersionUID = 201612008194101999L;
/**
* 页面元素
*/
// 有问题
private List<T> data = Collections.emptyList();
// 修复正常
// private List<T> data = new ArrayList<>();
/**
* 当前页码
*/
private Integer pageIndex = 0;
/**
* 每页展示数
*/
private Integer pageSize = 0;
/**
* 总页码
*/
private Integer totalPage = 0;
/**
* 总数
*/
private Long total = 0L;
/**
* 构建
*/
public static <T> Page<T> of (List<T> data, Integer pageIndex, Integer pageSize, Long total) {
Page<T> page = new Page<>();
page.setData(data);
page.setPageIndex(pageIndex);
page.setPageSize(pageSize);
page.setTotal(total);
page.setTotalPage(total, pageSize);
return page;
}
@Deprecated
public void setData(List<T> items) {
if (CollectionUtils.isEmpty(items)) {
return;
}
this.data = items.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
/**
* 设置总页数
*
* @param total 总数
* @param pageSize 分页大小
*/
@Deprecated
public void setTotalPage (Long total, Integer pageSize) {
this.total = total;
this.pageSize = pageSize;
if (total == null || total == 0) {
return;
}
if (pageSize == null || pageSize == 0) {
return;
}
int totalPage;
if (0 == total % pageSize)
totalPage = (int) (total / pageSize);
else
totalPage = (int) (total / pageSize + 1);
if(0==totalPage)
totalPage = 1;
this.totalPage = totalPage;
}
} Page类只有JDK生成的默认构造函数,其 |
这个不好解决呢 |
温少,这个我们通过初始化其他类型,升级解决了。是我们使用的问题,不是框架层面的。不用解决哈 |
@wenshao 使用了2.0.49,此问题还是会出现,会考虑优化这个问题吗? |
问题描述
ObjectReaderImplList中239行使用了Collections.emptyList(),导致空List反序列化后向其中添加元素时报java.lang.UnsupportedOperationException异常
环境信息
重现步骤
参见以下bug复现代码
期待的正确结果
空List反序列化后可以正常向其中添加元素。
全面排查并仔细评估所有使用了Collections.emptyList()和Collections.emptySet()的地方,有类似问题的地方建议一并修改。
相关日志输出
以上bug复现代码日志输出如下
附加信息
我使用fastjson2做Openfeign接口的序列化及反序列化,当Openfeign接口方法返回值不为空时,向list中添加元素不报异常。当返回空List后,再向list中添加元素时会报UnsupportedOperationException异常。
The text was updated successfully, but these errors were encountered: