全栈算法王导 2024-01-29 23:09 采纳率: 50%
浏览 61
已结题

java stream流异常问题?这难道是灵异bug?

发现是mybatis、mybatis-plus在将json字段转为List<[复杂对象]>时产生的问题:

    @TableField(value = "coords", typeHandler = JacksonTypeHandler.class)
    private List<PaperModelCoord> coords;

会将复杂对象序列化为linkedhashmap,如图:

img

请问有没有自定义类型转换器的解决方法?
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

  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-01-29 23:09
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的错误信息和代码片段来看,问题出在类型转换上。具体来说,在实际运行时,paperCoords 流中的某些元素不是 PaperModelCoord 类型,而是 java.util.LinkedHashMap 类型,这导致了 ClassCastException 异常。

    异常发生在这一行:

    List<PaperModelCoord> locatePointCoords = paperCoords.stream().filter(o -> o.getPage() == finalI).toList();
    

    当尝试对 paperCoords 中的元素应用 getPage() 方法时,因为它们实际上是 LinkedHashMap 而不是 PaperModelCoord 对象,所以抛出了 ClassCastException。

    要解决此问题,请检查 answerSheetTypeDto.getPaperModelRecognitionDtoList() 中返回的 PaperModelRecognitionDto 对象及其内部的 getCoords() 方法。确保这些方法没有返回任何非预期类型的对象,尤其是LinkedHashMap。

    在您的测试用例中(不会报错的部分),您手动创建并填充了正确的 PaperModelCoord 对象到列表中,因此没有出现异常。而在生产环境中,数据源可能是错误地将 LinkedHashMap 作为 Coord 数据返回,或者在某个处理环节出现了逻辑错误,将原本应为 PaperModelCoord 的对象替换为了 LinkedHashMap。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月5日
  • 修改了问题 1月30日
  • 创建了问题 1月29日