Когда я пытаюсь ввести моего производителя Logger в перечисление, я получаю NPE. Как я могу ввести Logger в перечисление?Как вставить регистратор в перечисление
Пример:
public enum MyEnum {
HI("Hi there!"),
HELLO("Hello mister!");
@Inject
private Logger log;
private final String greeting;
private MyEnum(String greeting) {
this.greeting = greeting;
// this.log = LoggerFactory.getLogger(this.getClass());
}
public String getGreeting() {
log.debug("Method getGreeting called");
return this.greeting;
}
}
Этот класс дает мне NPE на log.debug()
линии. Когда я удаляю @Inject
и раскомментирую линию this.log
, она работает.
TestCase выглядит следующим образом:
@RunWith(Arquillian.class)
public class CoverKindTest {
@Deployment
public static WebArchive createDeployment() {
return ShrinkWrap.create(WebArchive.class, "test.war")
.addClass(MyEnum.class)
.addClass(LoggerProducer.class)
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Test
public void testEnum() {
MyEnum myEnum = MyEnum.HI;
String greeting = myEnum.getGreeting();
assertThat("Should give the greeting.", greeting, is("Hi there!"));
}
}
Полный проверяемым проект на этот вопрос можно найти здесь, MyEnum.class
оригинальный вопрос, MyEnum1.class
это решение без инъекций (работает, но не то, что я ищу) и MyEnum2.class
- это рекомендуемый ответ.
Редактировать: Обновлено репо GitHub с рабочим решением. https://github.com/martijnburger/how-to-inject-a-logger-in-an-enum
Я думаю, что причина заключается в использовании CDI впрыснуть Logger и его не работает, потому что ваше перечисление не является bean => ваш логгер остается нулевым. –
Как вы называете перечисление? Для Inject для работы класс, в котором его используется, должен быть созданным прокси-объектом. Я предполагаю, что вы прямо вызываете 'MyEnum.HI.getGreeting()', и в этом случае соответствующая инфраструктура DI не будет знать, что ей нужно вставлять некоторые переменные. Можете ли вы вставить код того, как вы это вызвали? –
@BandiKishore Да, именно так я его использую. Я добавил тестовый файл. Есть ли способ использовать «LoggerProducer» для входа в эту ситуацию? –