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;

編集:required = falseを@Autowiredに追加し、すべてがロードされたら手動でsessionFactoryを注入すると、sessionFactoryBeanは確実に作成されます。正常に動作します。

編集2:web.xmlがありません。サーブレット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

この問題は、factoryBeansを機能させる方法に関連している可能性があります。完全に一致するわけではありませんが、Hibernate Session Factoryを構成すると、回避策についての洞察が得られる場合があります。

私はこれを試すことをお勧めします:

@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;
   }
}

これを修正する他の方法があるかもしれません。私は春のソースフォーラムで言及されたJIRAの問題を追跡していませんでした。それらは、「標準的な」方法を指している可能性があります。あるいは、Springのドキュメントは、Java構成でのFactoryBeanの処理に関する洞察を提供する場合があります。

于 2012-12-10T16:06:50.443 に答える