【问题标题】:Null pointer when auto-wiring in Spring BootSpring Boot中自动装配时的空指针
【发布时间】:2020-04-07 08:47:52
【问题描述】:

寻找自动连接外部 sdk 类的标准是什么,我正在尝试这种方式,但得到一个空指针。我在 Spring Boot 项目中使用 AmazonDynamoDBClient。所以我想我的配置类是这样的


@Configuration
public class DynamoDBClientBuilder {

    public AmazonDynamoDB amazonDynamoDBClient;
    @Bean
    public void DynamoDBClientBuilderInitializer() {

        amazonDynamoDBClient = this.initiateClient();

    }

    private AmazonDynamoDB initiateClient() {
        return AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration("http://localhost:4569", "us-west-1"))
                    .build();
    }
}

然后我有我想在spring项目中使用该客户端的类,最好在任何方法之外做这样的事情

    @Autowired
    private DynamoDBClientBuilder db;
    private AmazonDynamoDB amazonDynamoDBClient = null;

然后在构造函数或我们要使用客户端的地方进行此操作

amazonDynamoDBClient = db.amazonDynamoDBClient;

我不太确定为什么我得到一个空指针,似乎配置类没有在想要使用它的类之前启动。也很想听听最佳做法是什么,或者有更好的方法来做到这一点。

谢谢

【问题讨论】:

  • 所有自动装配的最佳实践是使用构造函数注入而不是字段注入。是否注入构建器或构建的客户端将取决于您的特定需求,例如能够为每个服务自定义它或处理生命周期操作。请注意,Spring Cloud AWS 可以为您处理很多这种自动配置,尽管它有非常强烈的意见并且并不适合所有人。
  • 实际上上面给了我一个关于 amazonDynamoDBClient = db.amazonDynamoDBClient; 的空指针异常,有什么想法吗?
  • 是的,按照我的建议使用构造函数注入。 @Autowired 字段直到对象被创建后才被注入,这是很大的问题。

标签: java spring spring-boot coding-style


【解决方案1】:

试试这个:

@Configuration
public class DynamoDBClientBuilder {
    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration("http://localhost:4569", "us-west-1"))
                .build();
    }
}

然后像这样注入你的bean:

@Autowired
AmazonDynamoDB amazonDynamoDB;

或使用构造函数(推荐):

private final AmazonDynamoDB amazonDynamoDB;

@Autowired
public MyClass(AmazonDynamoDB amazonDynamoDB) {
        this.amazonDynamoDB = amazonDynamoDB;
    }

请注意,您的配置类必须包含组件扫描才能在 Spring 上下文中创建 bean

【讨论】:

  • 那个工人完美!我将接受答案,但首先想知道您能否解释正在发生的事情或告诉我我的理解是否正确...... Spring 将首先调用配置类并创建 AmazonDynamoDb 实例,这是否意味着因为那里的方法名称,我们可以将其作为参数 amazonDynamoDB 在应用程序中使用 autowired 注释的任何位置引用?
  • @AnonymousAlias 是的,spring 创建了 bean whitch,您可以通过指定 anttribute 名称来注入。顺便说一句,您可以使用 @Qualifier 注释标记注入,以将特定 bean 注入参数。例如您已经使用方法amazonDynamoDB2() 声明了另一个 bean,因此您可以通过键入 Autowired 参数来注入它:@Autowired AmazonDynamoDB amazonDynamoDB2; 或:@Autowired @Qualifier("amazonDynamoDB2") AmazonDynamoDB amazonDynamoDB;
  • 构造函数参数是这样的:@Qualifier("amazonDynamoDB2") AmazonDynamoDB amazonDynamoDB
猜你喜欢
  • 2017-11-20
  • 2014-11-17
  • 2014-10-07
  • 2017-10-22
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2017-08-06
  • 2012-02-21
相关资源
最近更新 更多