【问题标题】:How to get a CrudRepository instance?如何获取 CrudRepository 实例?
【发布时间】:2018-02-20 01:41:59
【问题描述】:

最近我一直在关注如何使用 Spring Boot 在内存 H2 数据库中持久化数据的指南:

在其中,首先定义一个CustomerEntity 类,然后定义一个CustomerRepository 接口。然后,在主类中,进行了大量的注释魔术,这使得人们能够简单地“拥有”一个CustomerRepository 实例,该实例可用于将数据持久化到数据库、检索它等。

这一切都很好,但是,我需要在主类之外,在另一个类中使用这样的CustomerRepository 实例。由于本教程没有揭示使它在主类中可用的魔法,我不知道如何在我需要它的类中实现它。

我几乎整天都在试图弄清楚这一点,但我只是迷失在一堆文章中,所有的文章都试图解释哪个 Spring 注释做什么,现在我真的筋疲力尽了。

我想做这样的事情:

public class Foo {

  private CustomerRepository repo;

  // ...

  public void storeCustomer(String firstName, String lastName) {
    this.repository.save(new Customer(firstName, lastName));
  }

}

如果有一些提示,我会很高兴的。

【问题讨论】:

  • 您需要通过使用@Component 对其进行注释,然后在customerrepository-field 上使用@Autowired 将Foo 制作成一个spring 托管bean。 Spring依赖注入:-)
  • 非常感谢您的帮助!但是,当我打电话给storeCustomer 时,我得到一个NullPointerException...
  • @dwightschrute 你的包结构是什么样的?默认情况下,Spring Boot 将在您定义 @SpringBootApplication 的位置开始递归查找包。因此,请确保包含 Foo 的包是 Main 类的子类。
  • 确实没有包结构,所有源文件都是根目录下的兄弟。 Application.java的main方法用@SpringBootApplication注解,Foo.java在同一个包中。
  • 包如何成为类的子类?

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


【解决方案1】:

这是一个例子

@Component
public class Foo{

  @Autowired
    private CustomerRepository repo;

  // ...

  public void storeCustomer(String firstName, String lastName) {
    this.repository.save(new Customer(firstName, lastName));
  }

}

如果需要尝试,可以使用“CommandLineRunner”

@Bean
public CommandLineRunner myRunner(Foo myFooService){

  myFooService.storeCustomer("name","lastname");

}

【讨论】:

    【解决方案2】:

    您需要自动装配 CustomerRepository 对象,还需要从控制器自动装配 Foo 对象 foo 对象。

    public class Foo {
    
    @Autowire
    private CustomerRepository repo;
    
      public void storeCustomer(String firstName, String lastName) {
      this.repo.save(new Customer(firstName, lastName));
      } 
    }
    

    你需要从控制器/restcontroller 中自动连接 Foo 对象来调用 storeCustomer 方法。

    @Controller
    public class CustomerController{
    
      @Autowired
      Foo obj;
      @RequestMapping(method=RequestMethod.GET,value="addNewCustomer")
       public String addnewCustomer(){      
          obj.storeCustomer("firstname","lastname");
          return "";
    
       }
    }
    

    并使用@Configuration 在任何类中定义您的自动装配bean

    @Configuration
    public class AppConfig {
      @Bean
      public Foo obj(){
          return new Foo();
      }
      @Bean
      public CustomerRepository repo(){
          return new CustomerRepository();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2012-11-26
      • 2019-07-08
      • 2010-10-12
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多