1

Springバージョン3.2.2.RELEASEを使用しています。

Hibernateを使用してWebアプリを作成し、次の構成にします。

public class LifepulseServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[] { PersistenceConfig.class};
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[] { LifepulseWebConfig.class };
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/" };
}

@Override
protected WebApplicationContext createRootApplicationContext() {
    return super.createRootApplicationContext();
}

}

@Configuration注釈付きファイルを使用した2つは、次のようになります。

私のPersistenceConfigはContextLoaderListenerに使用する必要があります:

@Configuration
@EnableTransactionManagement(proxyTargetClass=true, mode=AdviceMode.PROXY)
public class PersistenceConfig{

Logger logger = LoggerFactory.getLogger(PersistenceConfig.class);

/** The Application Context. */
@Autowired
ApplicationContext context;

/**
 * Gets the database url.
 *
 * @return the database url
 */
@Bean(name="databaseUrl")
public String getDatabaseUrl(){
    return "jdbc:mysql://localhost/lifepulse";
}

/**
 * Gets the session factory properties.
 *
 * @return the session factory properties
 */
@Bean(name="sessionFactoryProperties")
public Properties getSessionFactoryProperties(){


    Properties props = new Properties();
    props.put("hibernate.dialect", MySQL5InnoDBDialect.class.getName());
    props.put("hibernate.hbm2ddl.auto", "create-drop");
    props.put("hibernate.show_sql", "true");
    props.put("hibernate.format_sql", "true");
    return props;
}


/** The Constant ANNOTATED_CLASSES. */
@SuppressWarnings("unchecked")
private static final Class<? extends Serializable>[] ANNOTATED_CLASSES=new Class[]{
    Melder.class,
    LogEntry.class
};


/**
 * Gets the annotated classes.
 *
 * @return the annotated classes
 */
private static Class<? extends Serializable>[] getAnnotatedClasses(){
    return ANNOTATED_CLASSES;
}

/**
 * Gets the data source.
 * This bean represents the application's MYSQL datasource, without using xml.
 *
 * @return the data source
 */
@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl(getDatabaseUrl());
    dataSource.setUsername("lifepulse");
    dataSource.setPassword("lifepulse");
    return dataSource;
}

/**
 * Session factory.
 * This bean represents the Hibernate Session Factory. By declaring this bean
 * it can easily be injected into Spring DAOs later on.
 * 
 * @return the local session factory bean
 */
@Bean
public LocalSessionFactoryBean sessionFactory() {

    LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
    factory.setAnnotatedClasses(getAnnotatedClasses());     
    factory.setHibernateProperties(getSessionFactoryProperties());
    factory.setDataSource(dataSource());
    return factory;
}

@Bean()
public GenericDao genericDao() {
    return new HibernateDaoImpl();
}

@Bean
PlatformTransactionManager txManager(){
    HibernateTransactionManager htm = new HibernateTransactionManager(sessionFactory().getObject());
    return htm;
}
}

私のLifepulseWebConfigはDispatcherSerlvetに使用する必要があります。

@Configuration
@EnableWebMvc
@ComponentScan(value= {"com.ansiworks.lifepulse.controllers"})
@EnableTransactionManagement(proxyTargetClass=true, mode=AdviceMode.PROXY)
public class LifepulseWebConfig extends WebMvcConfigurerAdapter{ 
@Autowired
ApplicationContext context;


@Bean
ViewResolver viewResolver(){
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    //resolver.setPrefix("");
    resolver.setSuffix(".jsp");
    return resolver;
}

@Bean
MainService mainService(){
    return new MainServiceImpl();
}

}

この構成は機能しません。DispathcerサーブレットはPersistenceConfigをロードしないため、BeanはLifepulseWebConfigに継承されません。

しかし:PersistenceConfigをメソッドLifepulseServletInitializer#getServletConfigClasses()のクラス配列に追加すると、すべてが正常に機能します。ただし、このようにsprin-securityを使用することはできません。

何が悪いの!?LifepulseServletInitializer#getRootConfigClasses()によって返されるconfig-classesがContextLoaderListenerによって読み取られないのはなぜですか?

私も同じ効果でこの方法で( LifepulseServletInitializerなしで)それを試しました。PersistenceConfigのBeanがロードされていないだけです...

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
      // Create the 'root' Spring application context
      AnnotationConfigWebApplicationContext rootContext =
        new AnnotationConfigWebApplicationContext();
      rootContext.register(PersistenceConfig.class);

      // Manage the lifecycle of the root application context
      container.addListener(new ContextLoaderListener(rootContext));

      // Create the dispatcher servlet's Spring application context
      AnnotationConfigWebApplicationContext dispatcherContext =
        new AnnotationConfigWebApplicationContext();
      dispatcherContext.register(LifepulseWebConfig.class);

      // Register and map the dispatcher servlet
      ServletRegistration.Dynamic dispatcher =
        container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

}
4

0 に答える 0