【问题标题】:Null pointer while trying to access Bean尝试访问 Bean 时出现空指针
【发布时间】:2018-04-25 01:04:43
【问题描述】:

我有一个创建多个 bean 的配置类:

@Configuration
public class TopLevelConfig {
    @Bean
    public MyMapper myMapper() {
        MyMapper mapper = new MyMapper();
        mapper.registerModule(new MetadataModule());
        return new MyMapper();
    }
}

现在在 MetadataModule 中:

@Override
public void setupModule(final SetupContext setupContext) {
    final SimpleDeserializers deserializers = new SimpleDeserializers();

    deserializers.addDeserializer(Payload.class, new PayloadDeserializer());
    setupContext.addDeserializers(deserializers);
}

PayloadDeserializer 中,我无法自动装配MyMapper 类。我在想这是因为当 PayloadDeserializer 的新对象被创建时,MyMapper 的 bean 还没有被创建。如何允许 PayloadDeserializer 访问 bean 对象?

【问题讨论】:

  • 你能发布空指针异常吗?这可能会提供线索
  • @DavidD NPE 是因为 myMapper 在 PayloadDeserializer 中为空

标签: spring dependency-injection javabeans spring-bean


【解决方案1】:

您正在通过调用new PayloadDeserializer() 自己创建PayloadDeserializer 对象,这就是MyMapper 没有注入到它的原因。要注入/自动装配工作,您的 bean 应该是弹簧管理的。为此,您可以在 PayloadDeserializer 类的顶部使用 @Component,如下所示。

@Component
public class PayloadDeserializer {
    private final MyMapper mapper;

    @Autowired
    public PayloadDeserializer(MyMapper mapper) {
        this.mapper = mapper;
    }
}

@Configuration
public class TopLevelConfig {
    @Bean
    public MyMapper myMapper(PayloadDeserializer payloadDeserializer) {
        MyMapper mapper = new MyMapper();
        mapper.registerModule(metadataModule(payloadDeserializer));
        return mapper;
    }

    @Bean
    public MetadataModule metadataModule(PayloadDeserializer payloadDeserializer) {
        return new MetadataModule(payloadDeserializer);
    }
}

public class MetadataModule {
    private final PayloadDeserializer payloadDeserializer;
    public MetadataModule(PayloadDeserializer payloadDeserializer) {
        this.payloadDeserializer = payloadDeserializer;
    }

    @Override
    public void setupModule(final SetupContext setupContext) {
        final SimpleDeserializers deserializers = new SimpleDeserializers();

        deserializers.addDeserializer(Payload.class, payloadDeserializer);
        setupContext.addDeserializers(deserializers);
    }
}

【讨论】:

  • 我不明白您在构造函数中使用 Autowire 的部分。不能直接在成员变量上使用Autowire吗?
  • 在您的示例中,您调用 metadataModule() 没有任何参数,但在定义中您将参数保留为 PayloadDeserializer。
  • 我们可以直接在member上使用autowire,但是Spring团队普遍提倡构造函数注入。 vojtechruzicka.com/…
  • PayloadDeserializer 的对象是什么时候创建的?因为 PayloadDeserializer 在其构造函数中需要 myMapper,但它在 myMapper 初始化之前已经作为对象传递。
  • 勾选此项以避免循环依赖异常。 baeldung.com/circular-dependencies-in-spring
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2015-03-22
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多