Проблема Spring Autowire с JavaConfig, getBean возвращает null (без исключений)

#spring

#spring

Вопрос:

Использование Spring 4.0.3.RELEASE…

Я преобразовывал нашу конфигурацию на основе Spring XML в JavaConfig, и я столкнулся с проблемой, которую я не понимаю. Все работает нормально при запуске на компьютере разработчика (Windows 7 и 8), но завершается сбоем при запуске на сервере сборки (Ubuntu) — как часть сборки, у нас есть модульные тесты, которые запускаются, и когда модульные тесты выполняются на сервере сборки, все они завершаются сбоем. Симптом заключается в том, что контекст приложения getBean(«name») возвращает null. Вот как все настроено:

 package com.x.common;

public class BeanFactory {
    private static ApplicationContext _context;

    static {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        if (ctx.getEnvironment().getActiveProfiles().length == 0) {
            ctx.getEnvironment().setActiveProfiles("prod");
        }

        ctx.scan("com.x.common.config");
        ctx.refresh();

        _context = ctx;
    }

    public static Object get(String name) {
        return _context.getBean(name);
    }
}
  

 package com.x.common.config;

@Configuration
public class AppConfig {
    @Autowired ILogger logger;
    @Bean public ILogger logger() {
        return logger;
    }
}

@Configuration
@Profile("prod")
public class ProdConfig {
    @Bean public ILogger logger() {
        return new ConsoleLogger("prod");
    }
}
  

У меня есть модульный тест, который в основном просто

 ILogger logger = (ILogger)BeanFactory.get("logger");
assertNotNull("Logger is null", logger);
  

Когда модульный тест выполняется на компьютере разработчика, либо как часть сборки, либо выполняется отдельно в Eclipse, logger является объектом типа ConsoleLogger. Но когда модульный тест выполняется на машине сборки (вызывается Дженкинсом), logger имеет значение null и никаких исключений не выдается. Пара человек здесь просмотрели это, но никто из нас не является мастером Spring (на самом деле я только начал использовать Spring пару недель назад), и мы не можем понять, в чем проблема. При первом запуске модульных тестов на консоль регистрируется ряд событий (Spring сообщает нам, что нашел AppConfig и перезаписывает возвращаемые значения значениями ProdConfig), и распечатки выглядят одинаково при локальном запуске и при запуске на компьютере сборки. Не видно ничего очевидного относительно того, в чем может заключаться проблема.

С файлами конфигурации XML все работало нормально, но мы не использовали Autowire с ними.

Комментарии:

1. Вы уверены, что у вас правильно есть "prod" в @Profile и setActiveProfile ? Ваш пример отлично работает для меня.

2. Для тестирования добавьте другой static метод для извлечения всех имен компонентов, для проверки профилей и т.д. Или перейдите в режим отладки.