【问题标题】:spring-boot @autowired interface (CrudRepository) in my Service class => Null pointer exception我的服务类中的spring-boot @autowired接口(CrudRepository)=>空指针异常
【发布时间】:2019-02-25 14:18:53
【问题描述】:

我有一些方法的公共接口

@Repository
public interface JobHistoryRepository extends CrudRepository<JobHistory, Long> {

    List<JobHistory> findByJobGroup(String jobGroup);
    JobHistory findById (Integer id);
    List<JobHistory> findByStateAndJobGroup(String state, String jobGroup);
    JobHistory findByJobNameAndJobGroupAndIdTrigger (String jobName, String jobGroup, String idTrigger);

}

我想在 myclass 服务中使用它

@Service
public class JobHistoryService {

    @Autowired
    private JobHistoryRepository jobHistoryRepository;


    public void setReadyJob(String jobId, String tenant, String idTrigger) {
    JobHistory jobHistory = new JobHistory();
     jobHistory.setJobName(jobId);
     jobHistory.setJobGroup(tenant);
     jobHistory.setIdTrigger(idTrigger);
     jobHistory.setIdUser("12345");
     jobHistory.setState("Ready");
     jobHistory.setDateCreation(new Date());

     jobHistoryRepository.save(jobHistory);   <--- at this point jobHistoryrespository is null why?
    }

编辑: 我已经在我的课程中添加了@service@repository 注释,但这仍然不起作用。每次我使用 JobHistoryService 方法时,jobRepository 依赖项仍然为空。

如果我必须添加更多信息,请告诉我。 谢谢。

【问题讨论】:

  • 然后显示你的 spring boot 配置。
  • 您是否确保调用您的服务的类也自动装配了该服务,而不是使用“new JobHistoryService()”?这也可能是这些地方出现 NPE 的原因。

标签: java spring-boot jersey autowired


【解决方案1】:
JobHistoryService

也应该是一个 Spring bean。注释它,例如@Service

@Service
public class JobHistoryService {
...
}

【讨论】:

  • @DavideBoldrin 你检查过你的应用程序会扫描服务类所在的包吗?
【解决方案2】:

假设你的界面是这样的:

public interface JobHistoryRepository extends CrudRepository<JobHistory, Long> {

    List<JobHistory> findByJobGroup(String jobGroup);
    JobHistory findById (Integer id);
    List<JobHistory> findByStateAndJobGroup(String state, String jobGroup);
    JobHistory findByJobNameAndJobGroupAndIdTrigger (String jobName, String jobGroup, String idTrigger);
}

然后创建一个服务类,如:

@Service
public class JobHistoryService {

    private final JobHistoryRepository jobHistoryRepository;

    public JobHistoryService (final JobHistoryRepository jobHistoryRepository)
    {
        this.jobHistoryRepository = jobHistoryRepository;
    }

    public void setReadyJob(String jobId, String tenant, String idTrigger) {
    JobHistory jobHistory = new JobHistory();
     jobHistory.setJobName(jobId);
     jobHistory.setJobGroup(tenant);
     jobHistory.setIdTrigger(idTrigger);
     jobHistory.setIdUser("12345");
     jobHistory.setState("Ready");
     jobHistory.setDateCreation(new Date());

     jobHistoryRepository.save(jobHistory);
    }

希望这会有所帮助。

【讨论】:

  • 在我看来这是一个糟糕的解决方法。如果您需要大量“自动装配”的类或接口怎么办?
  • 写这个:private final JobHistoryRepository jobHistoryRepository;公共 JobHistoryService (最终 JobHistoryRepository jobHistoryRepository) { this.jobHistoryRepository = jobHistoryRepository; } 等于这样写:@Autowired private JobHistoryRepository jobHistoryRepository;但是当一个先写的解决方案IDE帮助我找到错误时:我在另一个类中使用了一个新的运算符。
  • 您是否尝试过在您的 Spring Boot 应用程序类上使用 @ComponentScan?
  • 或者,你也可以参考这个例子javainterviewpoint.com/spring-boot-crudrepository-example
【解决方案3】:

试试这个注释

@ComponentScan(basePackages = {"com.blabla.example.*"})

在您的 Spring Boot 应用程序类上并检查您的存储库接口是否包含在该路径中。

我的例子:

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.blabla.gg.*"})
public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer{
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多