【问题标题】:@Autowired beans not loading after using beans:profiles in spring 3.1@Autowired beans 在 spring 3.1 中使用 beans:profiles 后未加载
【发布时间】:2012-10-29 23:33:03
【问题描述】:

我在我的 xml 中使用了 beans:profiles,如下所示:

    <beans profile="dev">
        <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.internal.url}" />
            <property name="username" value="${jdbc.internal.username}" />
        </bean>
   </beans>

我在 web.xml 中设置了spring.active.profiles

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/myapp-servlet.xml</param-value>
    </init-param>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>dev</param-value>
    </init-param>
</servlet>

我的代码结构是这样的:

//controller
@Controller 
public class MyController {
  @Autowired
  private MyService myService;
  ....
}

//service implementation
@Service("myservice")
public class MyServiceImpl implements MyService {
  @Autowired
  DBService dbService;
} 

//db service
@Service("dbservice)
public class DBServiceImpl implements DbService {
  @Autowired
  public void setDataSource (Datasource ds) { 
    this.jdbcTemplate = new JdbcTemplate(ds);
  }
}

错误:

创建名为“myController”的 bean 时出错:注入 自动装配依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 MyService 我的控制器.myService; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:

嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“dbService”的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配方法:公共无效 DBServiceImpl.setDataSource(javax.sql.DataSource);嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为依赖项找到了类型为 [javax.sql.DataSource] 的匹配 bean: 预计至少有 1 个 bean 有资格作为 autowire 候选 这种依赖。依赖注解:{} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)

【问题讨论】:

  • 什么是嵌套异常? :)
  • 更新 :) 似乎没有为数据源创建 bean。但我已经在 web.xml 中设置了活动配置文件...
  • 您是否尝试过授予公共访问权限? '公共 DBService dbService;'
  • 很遗憾,是的。这没什么区别...

标签: spring spring-mvc spring-3 autowired


【解决方案1】:

我猜您在 DispatcherServlet 上下文中使用配置文件,而 DataSource 可能位于根应用程序上下文中。

Difference between applicationContext.xml and spring-servlet.xml in Spring Framework

更新:尝试使用上下文参数(取自here):

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

【讨论】:

  • hmmm 所以我应该在应用程序上下文中设置配置文件?我该怎么做?
  • 我一直在关注这篇博文,他们就是这样做的:blog.springsource.com/2011/02/11/…
  • 我认为你可能是对的,因为当我明确使用 @Service("dbService) @Profile("dev") public class DBServiceImpl... 时,我至少不会得到 datasource not found 异常..但这不是我理想的解决方案。我更愿意在应用程序上下文中设置活动配置文件
  • 嗯,我正在阅读jira.springsource.org/browse/SPR-9035,他们同意这是设计使然,但他们似乎没有发布解决方案。
  • 或者我弄错了。因为如果我故意给个人资料起一个不好的名字,比如:@Service("dbService) @Profile("devasdfsfd") public class DBServiceImpl.. 即使这样我也没有找到数据源未找到异常......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2015-03-02
  • 2013-04-26
  • 1970-01-01
  • 2012-05-27
  • 2020-03-21
  • 2011-11-27
相关资源
最近更新 更多