【问题标题】:Spring - NoSuchBeanDefinitionException when autowiring Repository into ServiceSpring - 将存储库自动装配到服务中时出现 NoSuchBeanDefinitionException
【发布时间】:2018-05-22 15:45:21
【问题描述】:

我正在尝试将存储库自动装配到从控制器调用的服务中,但我不断收到以下错误消息:

Error creating bean with name 'mktPlace2PedidoService' defined in VFS resource [\"/home/davidgarcia/wildfly-11.0.0.Final/standalone/deployments/issuer.war/WEB-INF/classes/br/com/sinergico/service/mktplace2/MktPlace2PedidoService.class\"]: Unsatisfied dependency expressed through constructor argument with index 0 of type [br.com.sinergico.repository.mktplace2.MktPlace2PedidoRepository]: No qualifying bean of type [br.com.sinergico.repository.mktplace2.MktPlace2PedidoRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.sinergico.repository.mktplace2.MktPlace2PedidoRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

奇怪的是,我有许多其他存储库以完全相同的方式使用,但没有给出这个问题......

这是我在 Service 构造函数中对存储库的调用

package br.com.sinergico.service.mktplace2;

@Service
public class MktPlace2PedidoService extends GenericService<MktPlace2Pedido, Long> {

    private MktPlace2PedidoRepository repository;

    @Autowired
    public MktPlace2PedidoService(MktPlace2PedidoRepository repository) {
        super(repository);
        this.repository = repository;
    }

    //other methods
}

这是存储库

package br.com.sinergico.repository.mktplace2;

public interface MktPlace2PedidoRepository extends JpaRepository<MktPlace2Pedido, Long> {
    //some methods   
}

这是Entity声明

package br.com.entity.mktplace2;

@Entity
@Table(name="pedido", schema = "marketplace")
@SequenceGenerator(name="hibernate_sequence",    sequenceName="marketplace.hibernate_sequence",initialValue=1, allocationSize=1)
public class MktPlace2Pedido implements Serializable{

    private static final long serialVersionUID = 45381343130121532L;

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hibernate_sequence")
    private Long id;

    //other columns

}

我尝试将@Repository 注释包含到存储库中,但它没有做任何事情。

有人可以帮忙吗?我已经花了几个小时来解决这个问题......


编辑 - 解决方案

感谢 davidxxx,问题得以解决。我错过了@EnableJpaRepositories 中的包,现在它看起来像这样:

@EnableJpaRepositories(basePackages = { ... ,"br.com.sinergico.repository.mktplace2", ... })

【问题讨论】:

  • 您的存储库与您的服务在同一个 jar 中?你的配置类是什么样的?
  • 确保您的repository 在同一个基础包中
  • 存储库与我的服务在同一个 jar 中。它也在同一个基础包中。我会将包添加到问题文本中。我们在这里没有使用配置 xml 类,所以我不太确定它的外观。我会调查的
  • 只是一个猜测:您声明/启用@EnableJpaRepositoriesbasePackages 不是br.com.sinergico.repository.mktplace2 包的父包。
  • 哇!很好的猜测,@davidxxx !就是这样。非常感谢!!发表您的评论作为答案,我会将其标记为解决问题的评论。我不能在评论中这样做

标签: java spring service dependency-injection repository


【解决方案1】:

这个注释:

@EnableJpaRepositories(basePackages = ...)

将根据basePackages 属性的值启用 JPA 存储库。
通常你有两种使用方式:

  • 您可以指定与声明了JpaRepositorys 的包或父包相对应的单个String 值。
  • 或者您指定多个String 值,这些值对应于每个JpaRepositorys 的每个包。

实际上,您似乎在使用第二种策略,因为它适用于某些存储库,但不适用于这个。所以你必须明确添加这个存储库的包:

@EnableJpaRepositories(basePackages = { ... ,"br.com.sinergico.repository.mktplace2", ... })

请注意,第一种方式(使用单个值作为 basePackages )应尽可能受到青睐,因为它允许添加/删除新存储库而无需更新 basePackages 注释。

【讨论】:

    【解决方案2】:

    您没有创建 MktPlace2PedidoRepository 的任何 bean。使用 @Repository 注释您的界面。 另一种想法是,使用@EnableJpaRepositories("br.com.sinergico.repository") 提供Spring 信息在哪里可以找到Repository 类来创建bean

    【讨论】:

    • [@Repository] ​​注释在这种情况下没有任何区别。但是 [@EnableJpaRepositories] 做到了!谢谢!
    【解决方案3】:

    为Repository接口MktPlace2PedidoRepository添加@Repository注解

    还有,

    从 MktPlace2PedidoService 中删除构造函数并为 Repository 字段添加 @Autowired

    【讨论】:

    • 问题是我没有将包添加到@EnableJpaRepositories注解中
    猜你喜欢
    • 2015-02-22
    • 2014-03-22
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多