#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
метод для извлечения всех имен компонентов, для проверки профилей и т.д. Или перейдите в режим отладки.