[SPRING] 스프링 autowired 빈이 널 포인터를 발생시킨다.
SPRING스프링 autowired 빈이 널 포인터를 발생시킨다.
서비스를 사용하는 로거 클래스가 있습니다. 새 로거가 작성 될 때마다 싱글 톤 범위 로깅 서비스에 액세스 할 것으로 예상됩니다.
로거 서비스에 로깅 서비스를 제공하지만 null 포인터 예외가 반환됩니다. 나는 몇 가지 해결책을 시도했다.
내 junit 테스트에서이 작업을 수행하려고 노력 중이며 다른 응용 프로그램 컨텍스트를 사용하기 위해 컨텍스트 파일을 지정합니다. 그러나 동일하게 유지하더라도 문제가 해결되지는 않습니다.
아래 코드를 찾으십시오.
다음은 응용 프로그램 컨텍스트에서 발췌 한 것입니다.
<context:component-scan base-package="com.platform"/>
<bean id="asyncLoggingService" class="com.platform.services.AsyncLoggingServiceImplementation" scope="prototype"/>
다음은 Logger 클래스입니다.
package com.platform.utils;
import com.platform.services.AsyncLoggingService;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class OurLogger
{
private static Logger logger;
@Autowired
private AsyncLoggingervice asyncLoggingService;
public OurLogger(Class Clazz)
{
logger = LoggerFactory.getLogger(Clazz);
}
public void trace(TraceableObject object, String message)
{
//Do nothing yet
}
}
그런 다음 계속 로그를 남기기 위해 다른 서비스에서 로거를 사용합니다. (다른 로거를 작성하는 이유는 RabbitMQ 서버를 사용하기 위해서입니다.) 서비스에서 로거의 새 인스턴스를 인스턴스화 한 다음 적절히 사용합니다.
@Service
public class AsyncAccountServiceImplementation implements AsyncAccountService
{
private static final String GATEWAY_IP_BLOCK = "1";
private static OurLogger logger = new OurLogger(AsyncAccountServiceImplementation.class);
...
}
asyncLoggingService에서 메서드를 호출하려고하면 null 포인터가 OurLogger에서 발생합니다.
그런 다음 JUnit을 사용하여 AsyncAccountService를 테스트하려고합니다. 다른 응용 프로그램 컨텍스트를 추가했는지 확인하지만 여전히 null 포인터 예외가 발생합니다.
추가 정보가 필요하면 알려주십시오. 이 문제를 해결할 방법을 보았지만 제대로 작동하지 않는 것 같아서 어딘가에서 실수를했거나이 문제를 모두 제대로 이해하지 못하는 것 같습니다.
해결법
-
==============================
1.new로 개체를 만들 때 autowire \ inject가 작동하지 않습니다 ...
new로 개체를 만들 때 autowire \ inject가 작동하지 않습니다 ...
몇 가지 해결 방법은이 링크 및이 링크를 참조하십시오.
어쨌든 로거를 주사한다면 나는 다른 주제에 대한 나의 대답을 제안한다.
-
==============================
2.단지 2 센트를 추가하고 싶습니다.
단지 2 센트를 추가하고 싶습니다.
나는 IoC 세계에서의 삶에 익숙하지 않았을 때 한 번 같은 문제에 직면했다. 내 콩 중 하나의 @Autowired 필드는 런타임에 null입니다.
근본적인 원인은 Spring IoC 컨테이너 (@Autowired 필드가 실제로 올바르게 주입 된 컨테이너)에 의해 유지 관리되는 자동 생성 된 bean을 사용하는 대신, 그 bean에 대한 내 자신의 인스턴스를 새로 작성하고 사용하는 것입니다. 물론 Spring이 그것을 삽입 할 기회가 없기 때문에이 @Autowired 필드는 null입니다.
-
==============================
3.AspectJ를 사용한다면 @Configurable을 사용할 수있다.
AspectJ를 사용한다면 @Configurable을 사용할 수있다.
@Configurable public class OurLogger { .. }
See : AspectJ를 사용하여 Spring에 의존성 삽입하기
-
==============================
4.스프링 프레임 워크를 사용하여 JUnit 테스트 대신 단위 테스트를 수행하여 스프링 빈을 주입합니다.
스프링 프레임 워크를 사용하여 JUnit 테스트 대신 단위 테스트를 수행하여 스프링 빈을 주입합니다.
도움이 될지도 모릅니다.
-
==============================
5.애플리케이션 컨텍스트 내에서 로거를 참조해야합니다.
애플리케이션 컨텍스트 내에서 로거를 참조해야합니다.
<context:component-scan base-package="com.platform"/> <bean id="asyncLoggingService" class="com.platform.services.AsyncLoggingServiceImplementation" scope="prototype"/> <bean id="ourLogger" class="com.platform.utils.OurLogger"/>
그런 다음 서비스에 삽입해야합니다.
@Service public class AsyncAccountServiceImplementation implements AsyncAccountService { private static final String GATEWAY_IP_BLOCK = "1"; @Autowired private OurLogger logger; }
from https://stackoverflow.com/questions/25991191/spring-autowired-bean-causes-null-pointer by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 requestBody로 문자열을 날짜로 변환 할 수 없습니다. (0) | 2019.02.18 |
---|---|
[SPRING] jsp에서 Spring Controller 메소드로 매개 변수 전달하기 (0) | 2019.02.18 |
[SPRING] spring-boot webapp가 준비된 후 자동으로 브라우저를 시작합니다. (0) | 2019.02.18 |
[SPRING] JSR-356 WebSocket @ServerEndpoint와 Spring 3 bean의 통합 (0) | 2019.02.18 |
[SPRING] Jersey ExceptionMapper는 예외를 매핑하지 않습니다. (0) | 2019.02.18 |