Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在web应用程序中正确激活spring概要文件_Java_Spring - Fatal编程技术网

Java 如何在web应用程序中正确激活spring概要文件

Java 如何在web应用程序中正确激活spring概要文件,java,spring,Java,Spring,我试图在我的web应用程序中配置两个不同的配置类——一个使用jdbc,另一个使用hibernate。我将配置类定义如下: @Profile("jdbc") @Configuration public class JdbcConfiguration { ... } @Profile("hibernate") @Configuration public class HibernateConfiguration { ... } 我还有两个主要的配置类。一个用于服务,另一个用于定义jdb

我试图在我的web应用程序中配置两个不同的配置类——一个使用jdbc,另一个使用hibernate。我将配置类定义如下:

@Profile("jdbc")
@Configuration
public class JdbcConfiguration {
  ...
}


@Profile("hibernate")
@Configuration
public class HibernateConfiguration {
   ...
}
我还有两个主要的配置类。一个用于服务,另一个用于定义jdbc和hibernate配置类(例如,数据源bean)所需的一些数据库基础结构。以下是这些类:

@Import({JdbcConfiguration.class, HibernateConfiguration.class})
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:/db.properties")
public class DataAccessConfiguration {
   ...
}



@Configuration
@Import(DataAccessConfiguration.class)
@ComponentScan(basePackages = {"domain.validation","services"})
public class ServiceConfiguration {

    private final UserDao userDao;

    private final GroupDao groupDao;

    private final TaskDao taskDao;

    public ServiceConfiguration(UserDao userDao, GroupDao groupDao, TaskDao taskDao) {
        this.userDao = userDao;
        this.groupDao = groupDao;
        this.taskDao = taskDao;
    }
    ...
}
我试图做的是DataAccessConfiguration同时导入jdbc和hibernate配置。如果jdbc配置文件处于活动状态,则只应创建jdbc配置中的bean。否则(如果hibernate配置文件处于活动状态),则应创建hibernate的bean。然后我将DataAccessConfig导入ServiceConfiguration,它在服务中使用DAOBean。 我在文档中读到,为了在web应用程序中激活配置文件,我需要在我的web.xml中定义上下文参数spring.profiles.active,或者在引导时以编程方式将其添加到servletContext。我做了前者。这是我的web.xml

<web-app metadata-complete="false" version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
   http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" >
  <display-name>Easy Do Web</display-name>

  <context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>jdbc</param-value>
  </context-param>


</web-app>

您的配置看起来很好,尽管我们不需要@imported,因为它非常类似于bean配置的xml方式

根据堆栈跟踪, repository.UserDAOBean不是在spring上下文中创建的

spring上下文中没有定义UserDAOBean来执行此操作。 解决方案是通过注释在spring上下文中创建/注册UserDAOBean
带有@Repository的UserDao类。

您使用过XML配置或注释吗?如果您有Spring4.0注释,那么您需要自动连接DAO组件
组件扫描应该包括您已扫描的所有DAO组件,否则,即使您可能使用Autowired,scanner仍无法在扫描包中找到它,您可以在XML中或通过注释进行定义。

错误已修复。这是我的假设错误,因为我认为spring会在创建配置类之前激活配置文件,但是,很显然,spring只有在加载已经创建的配置类以创建web应用程序上下文时才会激活配置文件配置类将与服务配置类一起加载,因此spring将首先加载jdbc和hibernate,然后加载服务。希望这对其他人有所帮助。

尝试更改@Configuration@Profile(“jdbc”)公共类…..
@Import
注释的目的是什么?当然,每个配置都应该被独立地检测出来。你可以发布你的UserDao类吗?因为堆栈跟踪说没有在spring上下文中创建userdoabean。这是一个非常有趣的问题。我从未听说有人通过配置文件从JDBC切换到Hibernate。我意识到我没有提供任何答案,但是。。。您计划将此设置用于什么?这个方法给了你什么?@Filippossenti我认为原因完全是“教育性的”。目前我正在使用通过spring jdbc支持(jdbc模板)实现的dao层。将来我想切换到hibernate(保留两种实现)。我在jdbc和hibernate配置类中定义了三个bean定义。我在文章中添加了jdbc配置类的完整代码。
02-Jan-2020 13:29:46.070 INFO [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath
02-Jan-2020 13:29:48.973 SEVERE [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [listeners.ContListener]
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'serviceConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'repository.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:787)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:226)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:400)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
        at org.springframework.context.support.AbstractApplicationContext.initMessageSource(AbstractApplicationContext.java:732)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
        at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:89)
        at listeners.ContListener.contextInitialized(ContListener.java:37)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4685)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5146)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:456)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:405)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
        at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
        at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
        at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'repository.UserDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:874)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:778)
        ... 69 more
02-Jan-2020 13:29:48.974 INFO [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
02-Jan-2020 13:29:52.700 INFO [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
@Profile("jdbc")
@Configuration
public class JdbcConfiguration {

    private final DataSource dataSource;

    public JdbcConfiguration(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean(name = "userDao")
    public UserDao userDao(NamedParameterJdbcTemplate template){
        return new UserDaoSpringJdbc(dataSource,template);
    }

    @Bean(name = "groupDao")
    public GroupDao groupDao(UserDao userDao,NamedParameterJdbcTemplate template){
        return new GroupDaoSpringJdbc(dataSource,userDao,template);
    }

    @Bean(name="taskDao")
    public TaskDao taskDao(UserDao userDao,GroupDao groupDao,NamedParameterJdbcTemplate template){
        return new TaskDaoSpringJdbc(dataSource,userDao,groupDao,template);
    }

    @Bean
    NamedParameterJdbcTemplate template() {
        return new NamedParameterJdbcTemplate(dataSource);
    }


    @Bean(name = "transactionManager")
    PlatformTransactionManager jdbcTransactionManager() {
        DataSourceTransactionManager manager = new DataSourceTransactionManager();
        manager.setDataSource(dataSource);

        return manager;
    }



}