【问题标题】:Inner CrudRepository interface in Main doesn't worksMain 中的内部 CrudRepository 接口不起作用
【发布时间】:2016-08-23 20:10:09
【问题描述】:

我正在使用spring-data-jpa 进行一些测试,所以为了不创建新文件来执行存储库接口,我将其放在 Main 中,如下所示:

@SpringBootApplication
public class Application {

private static final Logger log = LoggerFactory.getLogger(Application.class);

public static void main(String[] args) {
    SpringApplication.run(Application.class);
}


@Bean
public CommandLineRunner demo(BRepository repository) {
    return (args) -> {
        log.info("Insert a");
        repository.save(new EntityA("TestA"));

        log.info("Find a " + repository.findOne(1));

    };
}


@Entity
@Table(name = "A")
public static class EntityA{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @Column(name = "NAME")
    private String name;

    //Getters, setters && constructors

}

public interface BRepository extends CrudRepository<EntityA, Integer> {

}

}

然后我用@BeanCommandLineRunner对其进行了测试以查看输出,但我得到了UnsatisfiedDependencyException

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demo' defined in hello.Application: Unsatisfied dependency expressed through method 'demo' parameter 0: No qualifying bean of type [hello.Application$BRepository] found for dependency [hello.Application$BRepository]: 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 [hello.Application$BRepository] found for dependency [hello.Application$BRepository]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at hello.Application.main(Application.java:27) [classes/:na] 

最后,为了确保我没有做错什么,我在一个新文件中对接口存储库进行了测试,它可以工作。

  • 有人知道为什么不使用内部接口的存储库吗?

  • 这是一个问题还是由于某种原因不起作用? (或者也许我做错了什么)

【问题讨论】:

  • org.springframework.stereotype 包中的@Repository 注释放在您的BRepository 接口上。
  • 它不适用于@Repository...同样的异常。
  • 您是否尝试使用@EnableAutoConfiguration@ComponentScan 注释来注释您的Application 类?
  • 它用@SpringBootApplication 注释,由@EnableAutoConfiguration@ComponentScan@SpringBootConfiguration、.. 和我试过@EnableJpaRepositories 组成,但也不起作用。 .
  • 让它成为一个嵌套类有什么意义呢?根据规范,它确实应该是一个顶级接口,实体也不能是嵌套类。即使这是一个错误/限制,我认为它不值得修复:正确的做法是将其定义为顶级接口。

标签: java spring-boot spring-data spring-data-jpa


【解决方案1】:

Spring 看不到嵌套存储库,要让它看到,请使用 @EnableJpaRepositories(尽管它已包含在 @SpringBootApplication 中)并将 considerNestedRepositories 布尔值设置为 true。

来源贴:https://stackoverflow.com/a/24485491/2816631

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2015-06-09
    • 2014-08-13
    • 2014-09-16
    相关资源
    最近更新 更多