Я сталкиваюсь с NullPointerException в моем приложении Spring при вызове метода на объекте с автоподстановкой. Класс вопрос выглядит следующим образом:Spring @Async @Autowired null только одним методом
@Component
public class Listener {
@Autowired
TemplateService templateService;
@Async
@EventListener
private Future<String> listener1(Event1 event) {
System.out.println(templateService);
return new AsyncResult<>(null);
}
@Async
@EventListener
public Future<String> listener2(Event2 event) {
System.out.println(templateService);
return new AsyncResult<>(null);
}
}
Когда я публикую событие, которое вызывает listener1
, значение null
печатается, но когда я публикую событие, которое вызывает listener2
, тем toString()
метод TemplateService
называется (как Я бы ожидал). Возможно, я недопонимаю какой-то аспект того, как @Async
влияет на объекты @Autowired
, но я не смог определить, что это будет. Я злоупотребляю @Async
? Я не понимаю, как использовать объекты @Autowired
в многопоточной среде?
Ваш класс не реализует интерфейс, который означает, что он не может рассматриваться для сканирования пути CLASSPATH. Вы не злоупотребляете Async. – JamesENL
@JamesENL Я не уверен, что вы подразумеваете под этим. ШаблонService подключен в listener2, поэтому контекст Spring должен знать класс. Какой интерфейс я бы использовал? – Christopher
У вашего слушателя нет интерфейса, поэтому Spring не знает об этом как о классе и не может создать прокси-сервер, который будет использоваться для создания методов Async. – JamesENL