【问题标题】:SpringBoot: Inject repository into a class defined in service layerSpring Boot:将存储库注入到服务层中定义的类中
【发布时间】:2016-04-15 15:41:13
【问题描述】:

我在 SO 上搜索了类似的问题,但没有找到非常具体的答案。 我是 Springboot 的新手。我在服务层定义了一个 POJO。我想将存储库注入这个类。不知何故,它一直都是null。这是我的代码结构,

文件:服务/ResultInstitute.java

@Document(indexName = "result_institute")
public class ResultInstitute implements Serializable {


@Inject
public CourseRepository courseRepository;

/**
 * 
 */
private static final long serialVersionUID = -2168910694195614091L;

public ResultInstitute(Institute institute)  {

    // Initialize all the values.

    for (Course course : institute.getCourses()){
        HashMap<String, String> courseDetails = courseRepository.getCourseDetails(course.getId());
        course.setCourseDetails(courseDetails);
        courses.add(course);
    }
    courses       = institute.getCourses();

    for (Course course : courses){
        subCategories.put(course.getSubCategory().getId(), course.getSubCategory().getDisplayName());
        categories.put(course.getSubCategory()
                             .getCategory()
                             .getId(), 
                       course.getSubCategory()
                             .getCategory()
                             .getDisplayName());
    }
}

public ResultInstitute (){}

private Long id;

private String code; ....

文件:存储库/CourseRepository.java

public interface CourseRepository extends JpaRepository<Course,Long> {

@Query("select distinct course from Course course left join fetch course.institutes")
List<Course> findAllWithEagerRelationships();

@Query("select course from Course course left join fetch course.institutes where course.id =:id")
Course findOneWithEagerRelationships(@Param("id") Long id);

@Query(value="SELECT DISTINCT(ci.course_details) FROM course_institute ci WHERE ci.courses_id = ?1", nativeQuery = true)
HashMap<String, String> getCourseDetails(Long id);

}

每当我尝试使用courseRepository 时,它都会给我NullPointerException。你能帮我解决这个问题吗?

【问题讨论】:

  • 如何创建ResultInstitute
  • 我没有使用任何向导。手动写的。
  • 你误会了,你是怎么实例化类的?
  • 好的。我有另一个 Resource 类,我通过它来实例化它。 ResultInstitute resultInstitute = new ResultInstitute(i); resultInstitute.locationFilterString(i);
  • 请使用此附加信息更新您的问题,而不是将其添加为评论。

标签: java dependency-injection spring-boot repository


【解决方案1】:

在评论部分你说你启动 ResultInstitute 类如下,

ResultInstitute resultInstitute = new ResultInstitute(i); resultInstitute.locationFilterString(i);

启动由您自己处理,因此@Autowired 在这种情况下将不起作用。 @Autowired 是用于注入 bean 的 spring 配置,因此注入 Repository ResultInstitute 应由 Spring 自身处理。

我们必须告诉 spring ResultInstitute 是 bean 类,因为你可以将 ResultIntitute 类注释为 @Component

@Component 
public class ResultInititute

所以当你想实例化 ResultInstitute 时,使用 @Autowired 实例化为一个 bean 类

@Autowired
ResultInstitute resultInstitute;

并且在实体类中使用 Respository 并不是一件好事,我们有 在单独的部分中处理。

【讨论】:

    【解决方案2】:

    您需要用@Component 注释您的ResultInstitute。这告诉 spring 它必须注入依赖项。

    【讨论】:

      【解决方案3】:

      将它添加到您的构造函数中 @Document(indexName = "result_institute") 公共类 ResultInstitute 实现 Serializable {

          public CourseRepository courseRepository;
      
          @Autowired
          public ResultInstitute (Institute institute, CourseRepository courseRepository) {
              this.courseRepository = courseRepository;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 2015-01-03
        • 2021-05-04
        • 2021-08-21
        • 2020-09-19
        • 1970-01-01
        • 2019-12-05
        相关资源
        最近更新 更多