【问题标题】:ClassCastException in StaxEventItemReaderStaxEventItemReader 中的 ClassCastException
【发布时间】:2019-07-16 16:04:15
【问题描述】:

我遇到了 ClassCaseException 的问题。我在 Spring 批处理中创建了 XStreamItemEventReader 来读取 xml 并将结果写入数据库。读者我正在阅读应该解析为该类的 xml:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeDTO {

    private Long id;
    private String firstName;
    private String surname;
    private String email;
    private Integer age;
}

我的 xml 项目阅读器是在该类中创建的:

public final class XMLReader<T> extends StaxEventItemReader<T> implements ClosableItemReader<T> {
    public XMLReader(Map<String, Object> parameters) {

        setResource(new FileSystemResource((File) parameters.get(RESOURCE)));
        setFragmentRootElementName((String) parameters.get(ROOT_TAG));

        Map<String, String> aliases = (Map<String, String>) parameters.get(ALIASES_MAP);
        XStreamMarshaller marshaller = new XStreamMarshaller();
        marshaller.setAliases(aliases);
        setUnmarshaller(marshaller);
        setStrict(false);
        open(new ExecutionContext());
    }

XMLReader 在该课程中正在阅读所有员工

public class EmployeeReader implements ItemReader<EmployeeDTO> {


    private final JobImportReaderFactory jobImportReaderFactory;
    private ClosableItemReader<EmployeeDTO> itemReader;

    public EmployeeReader(JobImportReaderFactory jobImportReaderFactory, JobFileRepository jobFileRepository) {
        this.jobImportReaderFactory = jobImportReaderFactory;
        this.jobFileRepository = jobFileRepository;
    }

    @BeforeStep
    public void setup() throws IOException {
        // this factory gives me XMLReader instance
        itemReader = jobImportReaderFactory.getItemReader(jobEnum, readerParameters, EmployeeDTO.class);

    }

    @Override
    public EmployeeDTO read() throws Exception {
        log.debug("read()");
        return itemReader.read();
    }
}

我的例外是这样的:

java.lang.ClassCastException: com.kk.tutorial.domain.dtos.EmployeeDTO 类不能转换为 com.kk.tutorial.domain.dtos.EmployeeDTO 类(com.kk.tutorial.domain.dtos.EmployeeDTO 是在加载器“app”的未命名模块中;com.kk.tutorial.domain.dtos.EmployeeDTO 在加载器 org.springframework.boot.devtools.restart.classloader.RestartClassLoader @24eb3739 的未命名模块中)

我尝试在 EmployeeDTO 中实现 Serializable,但它不起作用。我知道这是 ClassLoader 的问题,但我不知道如何处理 ClassLoader 以及如何将 itemReader.read() 中的值由另一个 ClassLoader 转换为 EmployeeDTO。你知道如何修复那个铸件吗?

【问题讨论】:

  • 你有 2 份可用的课程吗?也许一个直接在项目类路径中,另一个在 jar 依赖项中?
  • 不幸的是,这是同一堂课:/
  • 我在想,如果有多个副本,一个在应用程序中,一个在 jar 中,它们可能会被不同的类加载器拉入,从而导致此问题。这似乎是相关的:github.com/spring-projects/spring-boot/issues/3316。希望对您有所帮助,如果没有,请见谅。
  • 世界啊!!我需要从 pom.xml 中删除 devtools,因为 devtools 有第二类 cloader。无论如何感谢您的帮助:)

标签: java spring-boot spring-batch


【解决方案1】:

从 pom.xml 中删除 spring-boot-devtools 依赖项将修复该问题。

更新

devtools 正在使用一个单独的类加载器,这会导致给定的问题。

【讨论】:

  • 这是正确的答案,但解释一下会很好理解为什么。据我现在了解,它在不同的类加载器中加载类。
  • 是的,添加这个依赖会导致在单独的类加载器中加载一些类
猜你喜欢
  • 2014-12-15
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2012-06-25
  • 2019-05-12
  • 2014-04-09
  • 2017-12-05
相关资源
最近更新 更多