Java.lang.NullPointerException, вызывающий Datasource

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

Основная весенняя война:

@Configuration
@EnableTransactionManagement
public class ContextDatasource {

    @Bean
    public LocalSessionFactoryBean sessionFactory() throws NamingException {
        final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "org.plugin.database.models" });
        sessionFactory.setHibernateProperties(hibernateProperties());

        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway");
    }

    @Bean
    public PlatformTransactionManager hibernateTransactionManager() throws NamingException {
        final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    private final Properties hibernateProperties() {
        final Properties hibernateProperties = new Properties();
        return hibernateProperties;
    }
}

Библиотека DAO:

public class BlacklistsDaoHibernate implements BlacklistsDao {

    Session session;

    @Autowired
    SessionFactory sessionFactory;

    public BlacklistsDaoHibernate() {
        session = sessionFactory.getCurrentSession();
    }

    @Override
    public void saveOrUpdate(BlacklistsModel blacklistsModel) throws Exception {
        try {
            session.getTransaction().begin();
            session.saveOrUpdate(blacklistsModel);
            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
            throw new Exception("Error");
        }
    }

Но я получаю NPE на этой строке session = sessionFactory.getCurrentSession();

Как правильно использовать sessionFactory в модуле Library Jar?

Релевантно: Что такое инъекция поля и как ее избежать?

luk2302 08.07.2018 16:32

Как предполагается, что sessionFactory должен быть установлен до завершения конструктора, то есть до того, как экземпляр BlacklistsDaoHibernate даже существует для работы?

luk2302 08.07.2018 16:33

@ luk2302 следует использовать @Postconstruct?

Peter Penzov 08.07.2018 16:34

Нет, вам следует использовать инъекцию конструктора.

luk2302 08.07.2018 16:35

@ luk2302 не могли бы вы опубликовать пример кода?

Peter Penzov 08.07.2018 16:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать @PostConstruct или внедрение конструктора. Spring создает экземпляр вашего объекта, тогда разрешает его поля @Autowired. Вы можете попросить, чтобы он разрешил зависимости вашего объекта до создания экземпляра объекта с помощью внедрения конструктора.

С внедрением конструктора:

SessionFactory sessionFactory;
Session session;
public BlacklistsDaoHibernate(@Autowired SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
    this.session = sessionFactory.getCurrentSession();
}

С @PostConstruct:

@Autowired
SessionFactory sessionFactory;
Session session;

@PostConstruct
void init() {
    this.session = sessionFactory.getCurrentSession();
}

Редактировать: Если ваша цель - просто разрешить исключение NullPointerException, как указано в комментариях, используйте вместо этого:

@PostConstruct
void init() {
    this.session = sessionFactory.openSession();
}

Вот пример типичного использования SessionFactory в https://www.java2novice.com/hibernate/session-factory.

Я получаю ноль для сеанса.

Peter Penzov 08.07.2018 17:33

Вы начинаете сеанс на SessionFactory где-нибудь еще? Смысл вызова .getCurrentSession() в том, чтобы вы не создавали кучу дополнительных сеансов по всей программе. Обычно это делается путем создания настраиваемой «фабрики сеансов», которая внедряет SessionFactory и при вызове какой-либо функции getSession () проверяет, был ли уже открыт сеанс. Если нет, он начинает новый сеанс и возвращает его.

Steve Perkins 08.07.2018 17:37

Нет, я полагаю, что моя SessionFactory неверна. Вы можете проверить, я что-то упускаю?

Peter Penzov 08.07.2018 19:05

@PeterPenzov Взгляните на мою редакцию этого ответа. Это помогает?

Steve Perkins 09.07.2018 13:20

Подозреваю, что неправильно настраиваю запуск приложения. Не могли бы вы взглянуть сюда? stackoverflow.com/questions/51242707/…

Peter Penzov 09.07.2018 13:30

Неа. Я уже ответил на ваш вопрос, и вы проголосовали против меня, поэтому я не заинтересован в решении других ваших проблем.

Steve Perkins 11.07.2018 23:00

Это не мой голос против.

Peter Penzov 11.07.2018 23:10

Должен ли я использовать @Transactional для активации @Autowired?

Peter Penzov 11.07.2018 23:11

Другие вопросы по теме