使用@autowired到DI后得到一个空对象

时间:2017-08-29 07:54:39

标签: java spring dependency-injection spring-data-jpa

我有一个使用 @Autowired 的utils类,使用spring-boot-starter-data-jpa注入一个存储库。但是,当我使用此存储库访问数据库时,它表示存储库为null。我在我的控制器中使用了相同的方法,效果很好。这是我的 Utils.class

package com.example.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import com.example.dao.RuleRepository;
import com.example.model.Project;
import com.example.model.Rule;


public class Judge {

    @Autowired
    RuleRepository ruleRepository;

    public  boolean ageJudge(Project project) {
        try {

            if (ruleRepository == null) 
            {
                System.out.println("yes");
            }else {
                System.out.println("false");
            }

            return false;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }
}

这是我的 Application.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan(basePackages = {"com.example"})
public class DemoApplication {

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

这是 RuleRepository.java

package com.example.dao;

import org.springframework.data.jpa.repository.JpaRepository;

import com.example.model.Project;
import com.example.model.Rule;

public interface RuleRepository extends JpaRepository<Rule, Integer>{
    Rule findById(Integer id);
    Rule findByRuleName(String ruleName);

}

这是目录。 enter image description here

RuleRepository在控制器中运行良好。那么,问题是什么?

4 个答案:

答案 0 :(得分:2)

你的util class Judge是一个简单的POJO而不是Spring bean,你只能将Spring bean注入另一个Spring bean而不是普通的POJO。

如果您希望在ruleRepository内使用Judge bean,请使用@Component注释将其设为Spring组件:

@Component
public class Judge {

    @Autowired
    RuleRepository ruleRepository;

    .............................. 
}

@Service类的用户Judge注释充当业务逻辑实现类。

答案 1 :(得分:2)

您的Judge应注释@Component

@Component
public class Judge{
    // ...
}

这样Spring将实例化一个Judge bean,它将可用于注入。然后,您可以在任何托管bean中使用该判断bean(例如:控制器)

// SomeController
@Autowired
Judge judge;

但是,如果你实例化判断对象是你的自己,就像这样:

Judge judge2 = new Judge();

你的存储库将为null,因为Spring与judge2对象无关,它不是由Spring管理的。

答案 2 :(得分:1)

您需要让Judge课程至少成为项目的@Component,这将使您的课程由Spring管理,因此您的RuleRepository将被实例化。

如果首次尝试时无效,则必须在com.example.controller注释

中的待扫描包列表中添加@ComponentScan

答案 3 :(得分:0)

首先,每个人都提到你的班级,法官没有@Component注释。

另一件事是,也许我的春天变得有点生疏了。 但据我记忆,我认为您的存储库还需要@Component@Repository注释