Spring JavaConfig + WebMvcConfigurerAdapter + @Autowired => NPE

У меня есть приложение с двумя контекстами. Parent для веб-независимой бизнес-логики и ChildContext (неявно созданный диспетчерским сервлетом) для веб-логики.

Моя установка выглядит так

@Configuration
public class BusinessConfig {
   @Bean 
   public ObjectMapper jacksonMapper() { return new ObjectMapper() } 
}

а также

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private ObjectMapper objectMapper; // <- is null for some reason
    @Override
    public configureMessageConverters(List<HttpMessageConverter<?>> converters)    {
         MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
         converter.setObjectMapper(objectMapper); // <- bang!
         messageConverters.add(converter);
    } 
}

Мне нужен сопоставитель объектов в родительском контексте, так как я использую его также в конфигурации безопасности. Но может ли кто-нибудь объяснить мне, почему @Autowired objectMapper имеет значение null? Он создан в родительском контексте (тот факт, что родитель существует, даже регистрируется Spring при запуске). Также @Autowired по умолчанию имеет required=true, поэтому он не должен взрываться в методе configure (он должен был взорваться при построении контекста, если по какой-то причине bean-компонента не было).

Мне кажется, что весной может возникнуть проблема с жизненным циклом - в том смысле, что он сначала вызывает переопределенные методы, а затем @Autowires зависимости... Я также пытался @Autowire BusinessConfig (должен быть совершенно законным в соответствии с документации - результат был тот же (нулевой)).

Что я должен сделать, чтобы заставить это работать?

Заранее спасибо!

ИЗМЕНИТЬ – ОБНАРУЖЕНА ПРОБЛЕМА

Я нашел проблему. К сожалению, это не имело ничего общего ни с WebMvcConfigurerAdapter, ни с @Configuration. Это было вызвано преждевременной инициализацией контекста, вызванной отсутствием статического модификатора для propertyPlaceholderConfigurer... Я создал проблему в jira ядра Spring (https://jira.spring.io/browse/SPR-14382)


person malejpavouk    schedule 17.06.2016    source источник
comment
На самом деле весенние детско-родительские отношения работают наоборот. Родительский контекст не видит никаких bean-компонентов дочернего контекста. Но дочерний элемент видит все родительские компоненты. Нет сканирования компонентов, только явно созданные @Beans.   -  person malejpavouk    schedule 17.06.2016
comment
Да, моя ошибка. Дочерний элемент представляет Интернет, а родитель — серверную часть, и дочерний элемент может ссылаться/использовать bean-компоненты, определенные в родительском элементе. Можете ли вы опубликовать код, который представляет web.xml в JavaConfig? там мы можем видеть, как Web Layer Context и Application Layer Contex относятся к основной точке доступа   -  person Manuel Jordan    schedule 17.06.2016
comment
У меня нет с собой точного кода, но это шаблон: docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/   -  person malejpavouk    schedule 17.06.2016
comment
Я попробовал то же имя, и это не сработало...   -  person malejpavouk    schedule 20.06.2016
comment
Вы должны поделиться исходным кодом о том, как вы ссылаетесь на Web Layer Context и Application Layer Context через JavaConfig, этот файл должен быть заменой web.xml, без этого сообщество не сможет вам помочь.   -  person Manuel Jordan    schedule 20.06.2016


Ответы (1)


Как насчет того, чтобы просто переименовать метод объявления bean-компонента, чтобы он соответствовал автосвязанному bean-компоненту?

@Configuration
public class BusinessConfig {
   @Bean 
   public ObjectMapper objectMapper() { return new ObjectMapper() } 
}

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private ObjectMapper objectMapper;
    [...]
}
person Daniel Bubenheim    schedule 19.06.2016
comment
Попробую в понедельник. Но я полагаю, это не должно иметь значения, так как режим @Autowired по умолчанию должен быть по типу - person malejpavouk; 19.06.2016