Autowired Spring Bean периодически обнуляется - PullRequest
1 голос
/ 27 января 2020

У нас действительно странная проблема в нашем приложении, и мы исчерпали все возможности для устранения неполадок.

У нас есть bean-компонент, управляемый контейнером Spring, автоматически подключенный к bean-компоненту управляемой службы Spring. Во время инициализации мы можем видеть, что bean-компонент a успешно инициализирован и автоматически подключен к классу обслуживания, потому что мы можем видеть строку ClassBServiceImpl, инициализированную и bean-файл autowired успешно. напечатано в журналах запуска.

Но во время выполнения приложения мы периодически видим NullPointerException s в методе getA(). Поэтому мы добавили журнал, чтобы проверить, является ли bean-компонент с автонастройкой null. Конечно же, мы видим, что строка a равна нулю. что случилось с бобом? напечатано в журналах.

Мы царапаем наши головы, чтобы выяснить, почему бин, который был автоматически подключен ранее, не найден при необходимости. Это будет проблема Spring или что-то не так на уровне JVM, который вызывает проблему? Для справки наш стек - это один экземпляр Tomcat на модуль в OpenShift paas

public interface IntA {
      //methods
}

@Repository
public class ClassADao implements IntA {

}

public interface IntB {
      //methods
}

@Service
public class ClassBServiceImpl implements IntB {

   @Autowired
   IntA a;

    @PostConstruct
    public void init(){
        if(a== null)
            System.out.println("ClassBServiceImpl initialized but the autowiring of bean a has failed.");
        else{
            System.out.println("ClassBServiceImpl initialized and bean a autowired successfully.");
        }
    }

    @Override
    @Transactional(readOnly=true)
    public List<A> getA() {

        try {

            if(a== null){
                System.out.println("a is null. what happened to autowired bean?");
            }
            List<IssSuperUserAgency> listFromDb = 
                    a.getA();
            ///

        } catch (Exception e) {
            //throw exception
        }

        return new ArrayList<>();
    }



}

- EDIT -

Добавление фактического кода для ClassBServiceImpl.

@Service("issSuperUserAgencyService")
public class IssSuperUserAgencyServiceImpl implements IIssSuperUserAgencyService{

    @Autowired
    IIssSuperUserAgencyDao superuserAgencyDao;

    @PostConstruct
    public void init(){
        if(superuserAgencyDao == null)
            System.out.println("IssSuperUserAgencyServiceImpl initialized but the autowiring of superuserAgencyDao has failed.");
        else{
            System.out.println("IssSuperUserAgencyServiceImpl initialized and superuserAgencyDao autowired successfully.");
        }
    }

    @Override
    @Transactional(readOnly=true)
    public List<IssSuperUserAgency> getAgenciesByUserIdentifier(
            String userIdentifier) {

        try {
            /*
             * TODO - remove this if block in March 2020 release. It is added only for research purpose.
             */
            if(superuserAgencyDao == null){
                System.out.println("superUserAgencyDao is null. what happened to autowired bean?");
            }
            List<IssSuperUserAgency> listFromDb = 
                    superuserAgencyDao.getAgenciesByUserIdentifier(userIdentifier, CONTEXT_DASHBOARD);

            return getSuperUserAgencyList(listFromDb);

        } catch (Exception e) {
            LogUtils.error("Exception when trying to retrieve agencies list for super user", e);
        }

        return new ArrayList<>();
    }
...