发现是mybatis、mybatis-plus在将json字段转为List<[复杂对象]>时产生的问题:
@TableField(value = "coords", typeHandler = JacksonTypeHandler.class)
private List<PaperModelCoord> coords;
会将复杂对象序列化为linkedhashmap,如图:

请问有没有自定义类型转换器的解决方法?
mybatis-plus版本为:3.5.5
java stream流异常问题?这难道是灵异bug?
static List<String> appendAffineTransformMatAndResetImagesForSeparation(List<String> images, AnswerSheetTypeDto answerSheetTypeDto) {
List<PaperModelRecognitionDto> paperModelRecognitionDtoList = answerSheetTypeDto.getPaperModelRecognitionDtoList().stream().filter(o -> o.getType() == 4).toList();
List<PaperModelCoord> paperCoords = paperModelRecognitionDtoList.stream().flatMap(dto -> dto.getCoords().stream()).toList();
for (int i = 0; i < images.size(); i++) {
String image = images.get(i);
Mat mat = initMat(Imgcodecs.imread(image));
int finalI = i;
List<PaperModelCoord> locatePointCoords = paperCoords.stream().filter(o -> o.getPage() == finalI).toList();
FindLocatePointsDto findLocatePointsDto = getAffineTransformMat(mat, locatePointCoords);
answerSheetTypeDto.getAffineTransformMatMap().put(image, findLocatePointsDto.getAffineTransformMat());
Imgcodecs.imwrite(image, findLocatePointsDto.getResetImage());
}
return images;
}
上述代码在运行过程中
List<PaperModelCoord> locatePointCoords = paperCoords.stream().filter(o -> o.getPage() == finalI).toList();
会报错:
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class cn.df2680.luzhong.entity.po.inner.PaperModelCoord (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; cn.df2680.luzhong.entity.po.inner.PaperModelCoord is in unnamed module of loader 'app')
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178) ~[na:na]
at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) ~[na:na]
但很神奇的是,下面代码却不会报错:
public static void main(String[] args) {
List<PaperModelRecognitionDto> paperModelRecognitionDtoList = new ArrayList<>();
PaperModelRecognitionDto paperModelRecognitionDto = new PaperModelRecognitionDto();
List<PaperModelCoord> objects = new ArrayList<>();
objects.add(new PaperModelCoord().setPage(0).setPageHeight(123.3).setPageWidth(123.3).setBottomRight(new Coord(1.1,2.2)).setTopLeft(new Coord(1.1,2.2)));
objects.add(new PaperModelCoord().setPage(0).setPageHeight(123.3).setPageWidth(123.3).setBottomRight(new Coord(3.1,2.2)).setTopLeft(new Coord(1.1,2.2)));
paperModelRecognitionDto.setCoords(objects);
paperModelRecognitionDtoList.add(paperModelRecognitionDto);
List<PaperModelCoord> paperCoords = paperModelRecognitionDtoList.stream().flatMap(dto -> dto.getCoords().stream()).toList();
for (int i = 0; i < 2; i++) {
int finalI = i;
List<PaperModelCoord> locatePointCoords = paperCoords.stream().filter(o -> o.getPage() == finalI).toList();
System.out.println(locatePointCoords);
}
}
原因是什么?
求解
环境:java 17.0.8、springboot 3.2.1