【问题标题】:Class loader error - unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader类加载器错误 - 加载器 org.springframework.boot.devtools.restart.classloader.RestartClassLoader 的未命名模块
【发布时间】:2020-01-05 02:21:47
【问题描述】:

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

休眠: {调用 dis_entity.spdcmpracovnici(?,?,?,?)} 2019-09-02 01:56:01.355 WARN 8720 --- [nio-8050-exec-3] .m.m.a.ExceptionHandlerExceptionResolver:已解决 [java.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);
    }

我什至可能对解决方案有所了解!我可能应该自定义我的重启类加载器,如here 所示,但是我的技能到此结束,我不知道我应该在文件中指定什么。

有什么想法吗?

非常感谢。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    一个简单的解决方法是通过设置系统属性来disable the Restart

    spring.devtools.restart.enabled = false
    

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

    mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dspring.devtools.restart.enabled=false"
    

    【讨论】:

    • 我花了 8 个小时拉我的头发,直到我看到这个答案。在我修复删除的开发工具 jar 后,问题就消失了。
    • @RahulKhimasia 很高兴为拯救你的头发做出贡献 ;-)
    【解决方案2】:
    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')
    

    这与spring dev tools包有关。如果不需要,请尝试删除包。

    【讨论】:

      【解决方案3】:

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

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

      BaseClass bClass = new BaseClass(); // NOTICE HERE -> new BaseClass();
      
      
      // Somewhere in next code lines
      ChildClass childClass = (ChildClass) bClass;
      

      这将抛出您提到的错误

      这样做:

      BaseClass bClass = new ChildClass(); // NOTICE HERE -> new ChildClass();
      
      
      // Somewhere in next code lines
      ChildClass childClass = (ChildClass) bClass;
      

      我希望这能解决我的问题

      【讨论】:

        【解决方案4】:

        当我通过 persistence.xml 连接到 mysql 数据库时遇到了同样的问题:

        <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_1_0.xsd"
                     version="2.2">
            <!-- the name="pu" will be used in MainApplicationClass -->
            <persistence-unit name="pu1" transaction-type="RESOURCE_LOCAL">
                <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
                <properties>
                    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
                    <property name="hibernate.hbm2ddl.auto" value="update" />
                    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/spring_hibernate_jpa_db?useSSL=false&amp;serverTimezone=UTC&amp;useLegacyDatetimeCode=false"/>
                    <property name="hibernate.connection.username" value="hilal" />
                    <property name="hibernate.connection.password" value="hilal" />
                    <property name="hibernate.show_sql" value="false" />
                    <property name="hibernate.format_sql" value="true" />
                    <property name="hibernate.id.new_generator_mappings" value="true" />
                </properties>
            </persistence-unit>
        </persistence>
        

        对我来说唯一的解决方案是使用以下命令启动 mvn:

        mvn spring-boot:run -Dspring-boot.run.jvmArguments="Dspring.devtools.restart.enabled=false"
        

        【讨论】:

          【解决方案5】:

          从 pom.xml 中移除 devtools 的依赖会有所帮助

          <!--    <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-devtools</artifactId>
                      <scope>runtime</scope>
                      <optional>true</optional>
                  </dependency>
          -->
          

          【讨论】:

            【解决方案6】:

            你应该是主班

            public static void main(String[] args) {
            
                System.setProperty("spring.devtools.restart.enabled", "false");
            
                SpringApplication.run(MyApp.class, args);
            }
            

            【讨论】:

            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 2021-07-01
            • 1970-01-01
            • 2016-12-03
            • 2016-03-01
            • 2014-04-08
            • 1970-01-01
            • 1970-01-01
            • 2018-09-26
            • 1970-01-01
            相关资源
            最近更新 更多