我正在尝试在运行时使用OpenHFT为spring数据jpa生成一些存储库,以减少样板代码。问题是,当使用IDEA运行时,它运行得很好,但是,如果我在外部tomcat或仅在命令行中运行它:“ mvn spring-boot:run”,它将无法识别外部资源,例如@Resository
和一些书面课程。
我尽力查找问题,但没有用,但是我为该问题创建了最小的演示:github。 我还尝试使用不同的类加载器作为OpenHFT编译器的参数,例如.class,Repository.class和Thread.currentThread()。getContextClassLoader()。但仍然会出错。
@EventListener
private void initRepositoryMapping(ApplicationReadyEvent event) {
unMappedWithRepoEntity.add(Department.class);
unMappedWithRepoEntity.forEach((clazz) -> {
String className = "com.example.repository.DepartmentRepository";
String javaCode =
"\npackage com.example.repository;" +
"\nimport com.example.entity.Department;" +
"\nimport org.springframework.stereotype.Repository;" +
"\nimport java.util.UUID;" +
"\nimport com.example.repository.BaseRepository;" +
"\n@Repository" +
"\npublic interface DepartmentRepository extends BaseRepository<Department, UUID> {}" ;
logger.info("generating java class : {} code:{}", className, javaCode);
try {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
logger.info("using classloader: {}", classLoader);
CompilerUtils.CACHED_COMPILER.loadFromJava(classLoader, className, javaCode);
System.out.println(Class.forName("com.example.repository.DepartmentRepository"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
});
}