gpt4 book ai didi

java - Spring Boot 使用 Spring Profile 忽略来自 Java 配置类的 bean

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:42 27 4
gpt4 key购买 nike

当我使用经典上下文加载在 Eclipse 上运行我的应用程序时,不用担心,与所选 Spring 配置文件相对应的配置类上定义的 beans 已正确实例化。

public class BasketHandlerLoader {

public static void main(String[] args) throws Exception {
@SuppressWarnings("resource")
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:config/spring/spring-archibald-basket-handler-context.xml");
context.registerShutdownHook();
}
}

但是,当我使用 Spring Boot 运行应用程序时,这些 beans 没有被实例化。

@Configuration
@ImportResource("classpath:config/spring/spring-archibald-basket-handler-context.xml")
public class BasketHandlerLoader {

public static void main(String[] args) throws Exception {
SpringApplication.run(BasketHandlerLoader.class, args);
}
}

这是“dev”Spring 配置文件的 java 配置类:

@Configuration
@Profile("dev")
@EnableTransactionManagement
@PropertySources(value = { @PropertySource("classpath:filters/dev.properties") })
public class DevPersistenceConfig extends AbstractPersistenceConfig {

@Inject
private Environment env;

@Override
@Bean
public DataSource dataSource() {
return super.createDataSource(env);
}

@Override
public Properties hibernateProperties() {
return super.createHibernateProperties(env);
}
}

这里的 AbstractPersistenceConfig 类包含其他未实例化的 bean:

public abstract class AbstractPersistenceConfig {

// Constants...

// ************************** ABSTRACT METHODS **************************

/**
* Returns a property list containing the Hibernate properties.
*
* @return the Hibernate properties.
*/
public abstract Properties hibernateProperties();

/**
* Defines the application datasource bean corresponding with the current Spring Profile.
*
* @return the application datasource bean corresponding with the current Spring Profile.
*/
@Bean
public abstract DataSource dataSource();

/**
* Defines the Hibernate session factory bean.
*
* @return the {@code LocalSessionFactoryBean}.
*/
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { HIBERNATE_PACKAGE_TO_SCAN });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}

/**
* Defines the bean allowing to Hibernate to support the transaction handling mechanism.
*
* @return the {@code HibernateTransactionManager}.
*/
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory().getObject());
return txManager;
}

// ************************** PROTECTED METHODS **************************

// ...

// ************************** PRIVATE METHODS **************************

// ...
}

我尝试使用以下命令运行应用程序,结果相同:

java -jar archibald-basket-handler-1.0-SNAPSHOT.jar --spring.profiles.active=dev

java -jar -Dspring.profiles.active=dev archibald-basket-handler-1.0-SNAPSHOT.jar

具体来说,“sessionFactory”bean 没有实例化,不能注入(inject)到我的 GenericDaoImpl 类中...

堆栈跟踪:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'basketDaoImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory fr.ina.archibald.dao.impl.GenericDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:648)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:909)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:898)
at fr.ina.archibald.basket.loader.BasketHandlerLoader.main(BasketHandlerLoader.java:30)
... 6 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory fr.ina.archibald.dao.impl.GenericDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 21 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 23 more

我使用没有 Spring Boot 父 POM 的 Spring Boot 1.0.2.RELEASE。我只是在 POM 上定义了这个:

<dependencyManagement>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${org.springframework.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${start-class}</mainClass>
</configuration>
</plugin>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
<version>${org.springframework.boot.version}</version>
</dependency>

你有什么想法吗?

非常感谢!!

最佳答案

我认为你需要 @Import你的@Configuration直接上课或使用 @ComponentScan注解。您使用 ClassPathXmlApplicationContext 的初始示例将起作用,因为 XML 处理发生得早,并且 <component-scan>会找到你的 @Configuration处理之前的类。

第二个例子SpringApplication已经开始处理您的@Configuration类和 XML 通过 @ImportResource 加载.此时 XML 不可能 <component-scan>添加更多 @Configuration .

排序答案:尝试@ComonentScan在你的 BasketHandlerLoader类。

关于java - Spring Boot 使用 Spring Profile 忽略来自 Java 配置类的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959995/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com