Spring Quartz Job получает неинициализированный подкласс @Repository JdbcDaoSupport - PullRequest
0 голосов
/ 25 февраля 2020

В моем приложении Spring Boot я испытываю нулевой jdbcTemplate в подклассе JdbcDaoSupport, когда последний помечается @Repository.

Это класс Дао:

@Repository
public class Dao extends JdbcDaoSupport {

    @Autowired
    private DataSource dbDataSource;

    @PostConstruct
    private void initialize() throws Exception {
        setDataSource(dbDataSource);
    }

    /* ... */

Это класс обслуживания:

@Service
public class Service extends Dao {
    /* ... */

Это инициализация задания

@DisallowConcurrentExecution
public class Job extends QuartzJobBean {

    private Service service;

    @Autowired
    public void setService(Service service) {
        this.service = service;
    }

    /* ... */

}

Обратите внимание, что то же самое происходит, если я автоматически подключаю Дао внутри Службы .

Если я поставлю @Service на Дао, все в порядке.

После некоторой отладки я обнаружил, что PersistenceExceptionTranslationPostProcessor в конечном итоге заменяет мой компонент на сгенерированный прокси, на который аннотированный метод @PostConstruct не вызывается, поэтому мой базовый dao / service не инициализирован.

Я нашел замену в PersistenceExceptionTranslationPostProcessor суперклассе AbstractAdvisingBeanPostProcessor внутри метода postProcessAfterInitialization(Object, String).

Что-то не так в моем коде?

ОБНОВЛЕНИЕ

Я добавил Rest Controller, где я автоматически подключил службу. Я могу нормально выполнять запросы.

Отладчик показывает, что любой вызов метода Dao перехватывается прокси, но вызов getJdbcTemplate() - нет (я думаю, это из-за того, что final) следовательно, значение null.

...