【问题标题】:JpaRepository getting Null at service classJpaRepository 在服务类中获取 Null
【发布时间】:2020-07-03 04:10:00
【问题描述】:

我是 Java Spring boot 的新手,我正在使用 JPA 开发 REST API。 所以,我想在@RestController 之外访问JpaRepository。我在类头的顶部使用@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();
    }

}

【问题讨论】:

  • 您不能在 Spring 中自动装配静态字段。你能试着去除静电并尝试吗?
  • @Govind 如果我删除静态,那么我如何从另一个类中调用“getAllConfigurations()”方法。我想从另一个类访问这些实例。我可以创建新实例并调用此方法吗?
  • 您正在创建一个新的 ConfigurationHandler 实例。您应该使用 Spring 上下文中的 ConfigurationHandler ,该上下文将自动装配 configRepository。使用来自实例字段或构造函数参数的 @Autowired 实例。
  • @darkz ConfigurationHandler 类对我来说看起来不错。问题是你在哪里使用它,就像List&lt;ServiceConfiguration&gt; list = new ConfigurationHandler().getAllConfigurations();。你应该像 List&lt;ServiceConfiguration&gt; list = configurationHandler.getAllConfigurations(); 这样使用它,其中 configurationHandler 是 Spring 自动装配的实例字段。
  • @darkz,您可以自动装配 ConfigurationHandler 类并调用 getAllConfigurations() 方法,也可以自动装配 ConfigRepository 类并调用 findAll () 方法到另一个类中。

标签: java spring spring-boot hibernate jpa


【解决方案1】:

需要检查的几件事:

  1. ConfigRepository 中删除静态关键字,像这样使用它:

    @自动连线 私有 ConfigRepository configRepository;

  2. 确保你的repository接口和实体类在主Application.java包下或者确保你的Application.java在你包的根目录下,这样springboot自动配置会自动占用repository,否则使用@987654323 @。

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

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

【讨论】:

  • 谢谢,@Ananthapadmanabhan .. 问题是我使用新实例作为访问方法。 .@Autowired private ConfigurationHandler configurationHandler;configurationHandler.getAllConfigurations() 工作正常。再次感谢您的支持。
【解决方案2】:

尝试将, 添加到PriceHandlerServiceApplication 类中

@EnableJpaRepositories("repository.package")

同时删除 static 关键字

private static ConfigRepository configRepository;

【讨论】:

  • 我删除了 static 关键字添加的公共构造函数。 (我想从另一个类访问这个类)并且还为PriceHandlerServiceApplication 添加了@EnableJpaRepositories 注释。但仍然无法正常工作。仍然,存储库获得空值。
  • 当然,您可以在任何您想要的类中使用自动装配来访问,您是否将“repository.package”替换为您放置存储库的包?
  • 是的,我添加了.. @EnableJpaRepositories("com.assignment.priceHandlerService.repository") 但不起作用。
  • 请尝试一下,@EnableJpaRepositories(basePackages = "com.assignment.priceHandlerService.repository")
  • @EnableJpaRepositories(basePackages = "com.assignment.priceHandlerService.repository") 这也试过了。但仍然得到空值。
猜你喜欢
  • 2018-05-28
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2019-11-07
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多