【发布时间】: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