首页 > 解决方案 > JpaRepository 在服务类中获取 Null

问题描述

我是 Java Spring boot 的新手,我正在使用 JPA 开发 REST API。所以,我想在@RestController. 我使用@Component类头的注释顶部并使用@Autowired注释来声明我的存储库实例。但是,存储库实例总是为空。


应用类

@SpringBootApplication
@EnableJpaAuditing
public class PriceHandlerServiceApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run( PriceHandlerServiceApplication.class, args );
    }
}

存储库

@Repository
public interface ConfigRepository extends JpaRepository<ServiceConfiguration,Long>
{
}

模型类

@Entity
@Table( name = "service_configuration" )
@EntityListeners( AuditingEntityListener.class )
public class ServiceConfiguration
{
    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY )
    @JsonProperty("id")
    private Long id;

    @NotBlank
    @JsonProperty( "name" )
    private String name;

    @JsonProperty( "value" )
    private Double value;

    public ServiceConfiguration()
    {}
 }

服务等级

@Component
public class ConfigurationHandler
{
    @Autowired
    private static ConfigRepository configRepository;
    
    public static List<ServiceConfiguration> getAllConfigurations(){
        return configRepository.findAll();
    }
}

我叫ConfigurationHandler.getAllConfigurations()另一个班级。但configRepository总是为空。

[更新] 删除静态关键字,但仍然无法正常工作。仍然configRepository存储库为空

@Component
public class ConfigurationHandler
{
    @Autowired
    private ConfigRepository configRepository;

    public ConfigurationHandler()
    { }

    public List<ServiceConfiguration> getAllConfigurations()
    {
        return configRepository.findAll();
    }

}

标签: javaspringspring-boothibernatejpa

解决方案


需要检查的几件事:

  1. 从使用中删除静态关键字,ConfigRepository如下所示:

    @Autowired 私有 ConfigRepository configRepository;

  2. 确保你的仓库接口和实体类在主Application.java包下或者确保你的Application.java在你的包的根目录下,这样springboot自动配置会自动占用仓库,否则使用@EnableJpaRepositories(basePackages="your.package").

  3. 确保您尝试自动连接存储库的组件类在您使用它时实际上由 spring 管理。new如果您希望自动装配在您的组件类中工作,那就不要使用关键字。所以,当你想ConfigurationHandler使用它时:

    @Autowire 私有 ConfigurationHandler 配置处理程序;


推荐阅读