У нас действительно странная проблема в нашем приложении, и мы исчерпали все возможности для устранения неполадок.
У нас есть 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<>();
}