我有一个使用 @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);
}
RuleRepository在控制器中运行良好。那么,问题是什么?
答案 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
注释