类加载器错误 - 加载器 org.springframework.boot.devtools.restart.classloader.RestartClassLoader 的未命名模块

dda*_*dik 9 java spring spring-boot

我对 Spring 和 Java 整体还是很陌生,我目前正在研究 API。我有这段代码,它访问 MSSQL 数据库,检索结果并应该将其可视化,但它不起作用。我的意思是,如果我只调用过程并可视化结果集,它会正常工作。问题是我无法使用“RatingProcedure”对象。当我尝试获取某个对象的值时,它显示以下错误

休眠:{call dis_entity.spdcmpracovnici(?,?,?,?)} 2019-09-02 01:56:01.355 WARN 8720 --- [nio-8050-exec-3] .mmaExceptionHandlerExceptionResolver:已解决 [java.lang.lang. ClassCastException: 类 [Ljava.lang.Object; 无法转换为类 com.pproi.dcm.ratingprocedure.RatingProcedure([Ljava.lang.Object; 在加载器“bootstrap”的模块 java.base 中;>com.pproi.dcm.ratingprocedure.RatingProcedure 在加载器的未命名模块中>org.springframework.boot.devtools.restart.classloader.RestartClassLoader @7193df92)]

编码:

@GetMapping("/replacements/{sourceId}/workers")
    public ResponseEntity<List<PossibleReplacementResponseModel>> getReplacements(@PathVariable Integer sourceId,
            @RequestParam(required = false) Integer targetWorkerId,
            @RequestParam(required = false) Integer targetLineId,
            @RequestParam(required = false) String targetWorkplaces) {

        List<PossibleReplacementResponseModel> response = new ArrayList<>();

        // 400 Bad Request
        if ((targetLineId != null && targetWorkerId != null) || (targetWorkplaces != null && targetLineId == null))
            return ResponseEntity.badRequest().build();

        StoredProcedureQuery ratingProcedure = entityManager.createNamedStoredProcedureQuery("dcmrating");

        StoredProcedureQuery storedProcedure = ratingProcedure.setParameter("pk_target_worker", targetWorkerId)
                .setParameter("pk_target_sdl", targetLineId).setParameter("pk_target_workplaces", targetWorkplaces)
                .setParameter("pk_source_sdl", sourceId);

        List<RatingProcedure> ratings = storedProcedure.getResultList();

        for(RatingProcedure rating : ratings) {
            PossibleReplacementResponseModel responseModel = new PossibleReplacementResponseModel();
            Optional<Worker> _worker = workerRepository.findById(rating.getPersonalId());

            if(_worker.isPresent()) {
                Worker worker = _worker.get();
                responseModel.setId(worker.getId());
                responseModel.setName(worker.getFullName());
                responseModel.setSkills(findWorkersSkills(worker));
                responseModel.setPhysicalExamination(findWorkersMedicalExaminationEndDate(worker));
                responseModel.setExams(findWorkersExams(worker));
                responseModel.setRestrictions(findWorkersRestrictions(worker));
                responseModel.setRating(rating.getRating());
            }
            response.add(responseModel);
        }

        return ResponseEntity.ok(response);
    }
Run Code Online (Sandbox Code Playgroud)

我什至可能对解决方案有一个想法!我可能应该像这里看到的那样自定义我的重启类加载器,但是我的技能到此为止,我不知道我应该在文件中指定什么。

有任何想法吗?

非常感谢。

小智 10

java.lang.ClassCastException: class <Class_Name> cannot be cast to class <Class_Name> (<Class_Name> is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader <Class_Name> is in unnamed module of loader 'app')
Run Code Online (Sandbox Code Playgroud)

这与 spring 开发工具包有关。如果不需要,请尝试删除该包。

  • 如果需要 spring 开发工具怎么办? (7认同)

Ben*_*oit 8

一个简单的解决方法是通过设置系统属性来禁用重启

spring.devtools.restart.enabled = false
Run Code Online (Sandbox Code Playgroud)

例如,当使用 spring-boot maven 插件时,以这种方式启动应用程序:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dspring.devtools.restart.enabled=false"
Run Code Online (Sandbox Code Playgroud)

  • 我花了8个小时揪头发,直到看到这个答案。在我修复并删除开发工具 jar 后,问题就消失了。 (7认同)
  • @RahulKhimasia 很高兴为拯救你的头发做出贡献;-) (2认同)
  • 事实上,这只是一种解决方法,而不是解决方案。您正在禁用自动重新启动,因此每次更改后都必须手动重新启动。就像“我的车出了点小故障,所以我不再使用我的护理”。 (2认同)

Bri*_*kad 5

也许这里发生的事情是:正在创建基类的引用,然后对继承的类进行转换。

让我举个例子。假设我们有一个名为“BaseClass”的基类,并且一个类“ChildClass”正在扩展“BaseClass”。

BaseClass bClass = new BaseClass(); // NOTICE HERE -> new BaseClass();


// Somewhere in next code lines
ChildClass childClass = (ChildClass) bClass;
Run Code Online (Sandbox Code Playgroud)

这将引发您提到的错误。

做这个:

BaseClass bClass = new ChildClass(); // NOTICE HERE -> new ChildClass();


// Somewhere in next code lines
ChildClass childClass = (ChildClass) bClass;
Run Code Online (Sandbox Code Playgroud)

我希望这能解决我的问题