복붙노트

[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. ==============================

    1.new로 개체를 만들 때 autowire \ inject가 작동하지 않습니다 ...

    new로 개체를 만들 때 autowire \ inject가 작동하지 않습니다 ...

    몇 가지 해결 방법은이 링크 및이 링크를 참조하십시오.

    어쨌든 로거를 주사한다면 나는 다른 주제에 대한 나의 대답을 제안한다.

  2. ==============================

    2.단지 2 센트를 추가하고 싶습니다.

    단지 2 센트를 추가하고 싶습니다.

    나는 IoC 세계에서의 삶에 익숙하지 않았을 때 한 번 같은 문제에 직면했다. 내 콩 중 하나의 @Autowired 필드는 런타임에 null입니다.

    근본적인 원인은 Spring IoC 컨테이너 (@Autowired 필드가 실제로 올바르게 주입 된 컨테이너)에 의해 유지 관리되는 자동 생성 된 bean을 사용하는 대신, 그 bean에 대한 내 자신의 인스턴스를 새로 작성하고 사용하는 것입니다. 물론 Spring이 그것을 삽입 할 기회가 없기 때문에이 @Autowired 필드는 null입니다.

  3. ==============================

    3.AspectJ를 사용한다면 @Configurable을 사용할 수있다.

    AspectJ를 사용한다면 @Configurable을 사용할 수있다.

    @Configurable
    public class OurLogger {
      ..
    }
    

    See : AspectJ를 사용하여 Spring에 의존성 삽입하기

  4. ==============================

    4.스프링 프레임 워크를 사용하여 JUnit 테스트 대신 단위 테스트를 수행하여 스프링 빈을 주입합니다.

    스프링 프레임 워크를 사용하여 JUnit 테스트 대신 단위 테스트를 수행하여 스프링 빈을 주입합니다.

    도움이 될지도 모릅니다.

  5. ==============================

    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;
    
    }
    
  6. from https://stackoverflow.com/questions/25991191/spring-autowired-bean-causes-null-pointer by cc-by-sa and MIT license