【问题标题】:@Autowired not working for interface@Autowired 不适用于接口
【发布时间】:2014-07-16 00:13:20
【问题描述】:

我正在尝试过去 4 天 Google 提供的所有解决方案。但不工作。

我正在尝试在接口下方自动装配 -

@Qualifier("roleAccessRepository")
@Repository
public interface RoleAccessRepository extends BaseJPACrudRepository<RoleAccess, Long> {

以下列方式在 PermissionEvaluator 中。但它不起作用。

 @Scope(proxyMode = ScopedProxyMode.INTERFACES, value = "prototype")
public class PermissionEvaluator implements           org.springframework.security.access.PermissionEvaluator
 {

  @Autowired
  RoleAccessRepository roleAccessRepository;

.......

给我错误 -

      Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: net.pa
ger.lrs.sql.db.RoleAccessRepository net.pager.lrs.security.PermissionEvaluator.roleAccessRepository;
 nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying
bean of type [net.pager.lrs.sql.db.RoleAccessRepository] found for dependency: expected at least 1 b
ean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springf

但是在同一个包中定义并在服务类中自动装配的存储库运行良好。

@Service
@Transactional
public class AccountService extends BaseCrudService<Account> {

/** The account db. */
@Autowired
private AccountRepository accountDB;

}

我的 security.xml 如下 - 它具有作为父目录的基本包 net.pager.lrs。

<bean id="permissionEvaluator" class="net.pager.lrs.security.PermissionEvaluator">
    <constructor-arg index="0">

请帮帮我。

【问题讨论】:

  • 您的 PermissionEvaluator 是一个 @Component 并在 XML 中定义,由于组件扫描,您有多个 PermissionEvaluator 实例。删除 @Component 以使其不被检测到。另外,为什么所有原型都在范围内?单身应该没问题。
  • 非常感谢您的即时回复。实际上,对于 PermissionEvaluator,我将其添加为解决方法。和原型也是。将尝试删除它。
  • 我尝试删除 PermissionEvaluator 的 @Component 并删除 Prototype 范围。但是在我执行 @Autowired(required = true) RoleAccessRepository roleAccessRepository; 时仍然出现同样的错误
  • 我觉得你可能对上下文层次有问题。您的组件扫描在哪里定义,您的&lt;bean id="permissionEvaluator"&gt; 在哪里定义? (顺便说一句。required = true 默认为 @Autowired)。另外,如果您可以格式化该堆栈跟踪,那也可以。
  • 帮助我理解这一点。我看到错误说没有合格的 bean。你有接口 RoleAccessRepository 的实现吗?

标签: spring spring-mvc spring-security annotations autowired


【解决方案1】:

好的,

从上面的讨论中,我仍然认为问题在于没有Autowired 接口的具体实现。只是为了常识,如果您不提供实现,您将使用Autowired接口的引用执行什么。

有一种方法是你不定义实现,spring可以生成代理bean和自动装配,但那是没有用的。

您最终也可能会提供接口的匿名实现。

【讨论】:

  • 我也尝试过,通过实现接口和自动装配类。但是遇到了同样的错误。原因如下:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:net.pager.lrs.sql.db.RoleAccessRepositoryImpl net.pager.lrs.security.PermissionEvaluator.roleAccessReposit oryImpl;嵌套异常是 java.lang.IllegalArgumentException: Can not set net.pager.lrs.sql.db.Ro leAccessRepositoryImpl field net.pager.lrs.security.PermissionEvaluator.roleAccessRepositoryImpl to $Proxy55
  • "有一种方式,你不定义实现,spring可以生成代理bean和autowire,但那是没有用的。"你为什么这么认为,能告诉我原因吗?
猜你喜欢
  • 2014-10-29
  • 2013-11-07
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2013-05-13
相关资源
最近更新 更多