1

我以编程方式设置了我的应用程序配置,并且我正在导入这样的 bean:

@Configuration
@ImportResource( value= { "classpath:myBean.xml"})
public class AppConfig extends WebMvcConfigurerAdapter
{

myBean.xml我有这个:

  <bean id="myBeanId" class="my.domain.myBeanClass">
    <property name="sessionFactory" ref="my_session_factory" />
    <property name="someOtherProperty"...
  </bean>

这工作正常并被sessionFactory注入myBeanClass.

但是,如果我尝试以编程方式实例化同一个 bean,转换ImportResourceImport,我得到“没有为依赖项找到类型 [org.hibernate.SessionFactory] ​​的匹配 bean...”错误。

@Configuration
@Import(BeanConfig.class)
public class AppConfig extends WebMvcConfigurerAdapter
{

Bean 配置类:

@Configuration
public class BeanConfig
{
  @Autowired
  private SessionFactory sessionFactory;

  @Bean(name="myBeanId")
  public MyBeanClass createMyBeanClass()
  {
    MyBeanClass mbc = new MyBeanClass();
    mbc.setSessionFactory(sessionFactory);
    ....
    return mbc;

编辑:肯定会创建 sessionFactory bean,如果我添加 required = false 到@Autowired,然后在加载所有内容后手动注入 sessionFactory。它工作正常。

编辑 2:我没有 web.xml,我使用的是 servlet 3,所以以编程方式声明了所有内容。这是我的 web.xml 等价物

@Configuration
public class WalletInitialiser implements WebApplicationInitializer
{

  @Override
  public void onStartup(ServletContext aServletContext) throws ServletException
  {
    AnnotationConfigWebApplicationContext mvcContext
      = new AnnotationConfigWebApplicationContext();

    mvcContext.register(AppConfig.class);
    mvcContext.scan("config.packages", "class.packages");
    aServletContext.addListener(new ContextLoaderListener(mvcContext));
    //add security filters, dispatcher to servlet, logback

我在另一个类中配置了我的 SessionFactory,配置包中的 HibernateConfig 正在从中获取

mvcContext.scan("config.packages", "class.packages");

这节课的摘录是:

@Configuration
@EnableTransactionManagement
public class HibernateConfig
{
  @Bean(name="my_session_factory")
  public LocalSessionFactoryBean baseSessionFactory()
  {
    LocalSessionFactoryBean lsfb= new LocalSessionFactoryBean();
    lsfb.setPackagesToScan("class.packages");
    lsfb.setAnnotatedPackages("class.packages");

    //add hibernate props for datasource
    return lsfb;
  }
}
4

1 回答 1

1

这个问题可能与How to make factoryBeans work...有关。尽管它不是完全匹配的配置 Hibernate 会话工厂可能会为解决方法提供见解。

我建议试试这个:

@Configuration
public class BeanConfig {
   @Autowired
   private LocalSessionFactoryBean sessionFactoryBean;

   @Bean(name="myBeanId")
   public MyBeanClass createMyBeanClass() {
      MyBeanClass mbc = new MyBeanClass();
      mbc.setSessionFactory((SessionFactory) sessionFactoryBean.getObject());
     ....
     return mbc;
   }
}

可能还有其他方法可以解决这个问题,我没有跟踪 spring 源论坛中提到的 JIRA 问题,它们可能指向“标准”方式。或者,Spring 文档可能会深入了解 Java 配置中 FactoryBeans 的处理。

于 2012-12-10T16:06:50.443 回答