Нулевой указатель при попытке доступа к Бину - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть класс конфигурации, который создает несколько бинов:

@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 к тому времени не был создан. Как мне разрешить PayloadDeserializer получить доступ к объекту bean?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы создаете PayloadDeserializer объект самостоятельно, вызывая new PayloadDeserializer(), по этой причине MyMapper не вводится в него.Чтобы ввести / autowire на работу, ваш боб должен быть подпружиненным.Для этого вы можете использовать @Component поверх вашего PayloadDeserializer класса, как показано ниже.

@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);
    }
}
...