열거 형에 내 로거 생성기를 삽입하려고하면 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;
}
}
이 클래스는 나에게 log.debug()
줄에 NPE을 제공 : 예
. @Inject
을 제거하고 this.log
행의 주석 처리를 제거하면 작동합니다.
테스트 케이스는 다음과 같습니다
이 질문에 대한@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를 사용하여 생각 열거 형이 빈이 아니기 때문에 작동하지 않습니다. => 로거가 null로 유지됩니다. –
열거 형은 어떻게 부릅니까? Inject가 사용되는 클래스가 프록시 생성 객체 여야하는 클래스를 작동시키기 위해서. 나는 당신이 직접'MyEnum.HI.getGreeting()'을 호출하고있는 것으로 추측하고 있는데, 해당 DI 프레임 워크는 어떤 변수를 주입해야한다는 것을 모를 것이다. 이 코드를 어떻게 호출했는지 코드를 붙여 넣을 수 있습니까? –
@BandiKishore 네, 그게 제가 사용하는 방법입니다. 나는 테스트 케이스를 추가했다. 이 상황에서 로깅을 위해'LoggerProducer'를 사용할 방법이 있습니까? –