如何解决EntityManager Bean 创建异常仅与 ShadowJar,java.lang.IllegalArgumentException:不是参数化类型使用 Apache Beam 库
我在创建 entityManager bean 时遇到以下错误,仅当我运行 shadowJar 时。
bootJar 或 bootRun 没有给出任何例外;它工作正常。我需要创建一个影子罐。
异常
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elabsEntityManager' defined in class path resource [com/sample/orchestrator/config/ElabsDataSourceConfig.class]: Invocation of init method Failed; nested exception is java.lang.IllegalArgumentException: Not a parameterized type!
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1788)
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:609)
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:531)
at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:335)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:333)
at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:208)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159)
at org.springframework.context.support.AbstractApplicationContext.finishbeanfactoryInitialization(AbstractApplicationContext.java:913)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
at com.sample.orchestrator.orchestratorApplication.main(orchestratorApplication.java:27)
Caused by: java.lang.IllegalArgumentException: Not a parameterized type!
at org.jboss.jandex.Type.asParameterizedType(Type.java:228)
at org.jboss.jandex.Indexer.resolveTypePath(Indexer.java:768)
at org.jboss.jandex.Indexer.resolveTypePath(Indexer.java:780)
at org.jboss.jandex.Indexer.resolveTypePath(Indexer.java:775)
at org.jboss.jandex.Indexer.resolveTypeAnnotation(Indexer.java:718)
at org.jboss.jandex.Indexer.resolveTypeAnnotations(Indexer.java:613)
at org.jboss.jandex.Indexer.index(Indexer.java:1602)
at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassDescriptor(ClassFileArchiveEntryHandler.java:64)
at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:52)
at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:147)
at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:48)
at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:76)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:107)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:254)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:168)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:52)
at org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean.createNativeEntityManagerFactory(LocalContainerEntityManagerfactorybean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerfactorybean.buildNativeEntityManagerFactory(AbstractEntityManagerfactorybean.java:409)
at org.springframework.orm.jpa.AbstractEntityManagerfactorybean.afterPropertiesSet(AbstractEntityManagerfactorybean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerfactorybean.afterPropertiesSet(LocalContainerEntityManagerfactorybean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.invokeInitMethods(AbstractAutowireCapablebeanfactory.java:1847)
at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1784)
... 17 more
build.gradle
dependencies {
// Comment these beam libraries to not see the error in shadow jar But i need this
implementation 'org.apache.beam:beam-sdks-java-core:2.27.0'
implementation 'org.apache.beam:beam-runners-direct-java:2.27.0'
implementation 'org.apache.beam:beam-runners-google-cloud-dataflow-java:2.27.0'
// ....other dependencies
}
jar {
manifest {
attributes "Main-Class": "com.sample.orchestrator.orchestratorApplication"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
shadowJar {
zip64 = true
exclude "**/Log4j2Plugins.dat"
// required for Spring
mergeServiceFiles()
append 'meta-inf/spring.handlers'
append 'meta-inf/spring.schemas'
append 'meta-inf/spring.tooling'
transform(PropertiesFileTransformer) {
paths = ['meta-inf/spring.factories' ]
mergeStrategy = "append"
}
}
这里是实体管理器相关的bean。
@Configuration
@EnableJpaRepositories(basePackages = {
"com.sample.orchestrator.database.elabs.repository" },entityManagerFactoryRef = "elabsEntityManager",transactionManagerRef = "elabsTransactionManager")
@PropertySource("classpath:application-${spring.profiles.active}.yml")
public class ElabsDataSourceConfig {
@Value("${spring.datasource-elabs.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource-elabs.url}")
private String url;
@Value("${spring.datasource-elabs.username}")
private String username;
@Value("${spring.datasource-elabs.password}")
private String password;
@Value("${spring.jpa.database-platform}")
private String dialect;
@Value("$(spring.jpa.hibernate.ddl-auto)")
private String ddlAuto;
@Value("$(spring.jpa.show-sql)")
private String showsql;
@Bean(name = "datasource-elabs")
public DataSource datasourceElabs() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean("elabsEntityManager")
public LocalContainerEntityManagerfactorybean elabsEntityManager() {
LocalContainerEntityManagerfactorybean em = new LocalContainerEntityManagerfactorybean();
em.setDataSource(datasourceElabs());
HibernateJpavendorAdapter vendorAdapter = new HibernateJpavendorAdapter();
em.setJpavendorAdapter(vendorAdapter);
em.setPackagesToScan(new String[] { "com.sample.orchestrator.model.database.elabs" });
// em.setPersistenceXmlLocation("classpath:persistence.xml");
HashMap<String,Object> properties = new HashMap<>();
properties.put("hibernate.dialect",dialect);
properties.put("hibernate.ddl-auto",ddlAuto);
properties.put("hibernate.show-sql",showsql);
em.setJpaPropertyMap(properties);
return em;
}
@Bean("elabsTransactionManager")
public PlatformTransactionManager elabsTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(elabsEntityManager().getobject());
return transactionManager;
}
}
要运行请包括
./gradlew bootRun -Pdev
-
./gradlew bootJar
并在运行时包含“-Dspring.profiles.active=dev” -
./gradlew shadowJar
并包含“-Dspring.profiles.active=dev”——错误步骤。
我没有使用 bootJar 的原因,因为我正在使用应用程序创建一个 google 数据流管道,依赖的 jar 文件没有从 bootJar 暂存(Beam 需要依赖的绝对路径来暂存相关文件)。但是我尝试过使用非 spring maven 着色的 jar,所有依赖文件都已上演。希望通过 spring shadowJar 实现同样的效果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。