Java SessionFactory在Hibernate5 Spring 4.2上提供NullPointerException

Java SessionFactory在Hibernate5 Spring 4.2上提供NullPointerException,java,spring,hibernate,nullpointerexception,Java,Spring,Hibernate,Nullpointerexception,我有一个名为PersistenceJPAConfig的Java配置类,我在其中配置了与持久性相关的内容(会话工厂、事务等), 一个UserService类,它与UserDAO通信,使用SessionFactory中的方法从数据库获取所有用户 从理论上讲,一切似乎都运转良好。然而,当我试图获取这些用户时:抛出一个“NullPointerException” 有人有线索吗 配置类 @Configuration @EnableTransactionManagement public class Per

我有一个名为
PersistenceJPAConfig
的Java配置类,我在其中配置了与持久性相关的内容(会话工厂、事务等), 一个
UserService
类,它与
UserDAO
通信,使用SessionFactory中的方法从数据库获取所有用户

从理论上讲,一切似乎都运转良好。然而,当我试图获取这些用户时:抛出一个“NullPointerException”

有人有线索吗

配置类

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig {


@Bean
public SessionFactory sessionFactory(){

    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource());

    sessionBuilder.scanPackages("com.br.modelar.Modelar.model").addProperties(additionalProperties());
    SessionFactory sessionFactory = sessionBuilder.buildSessionFactory();

    return sessionFactory;
}

@Bean
public HibernateTransactionManager transactionManager(){

    HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory());
    return transactionManager;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    LocalContainerEntityManagerFactoryBean manager = new LocalContainerEntityManagerFactoryBean();
    JpaVendorAdapter adapter = new HibernateJpaVendorAdapter();

    manager.setDataSource(dataSource());
    manager.setPackagesToScan("com.br.modelar.Modelar.model");
    manager.setJpaVendorAdapter(adapter);
    manager.setJpaProperties(additionalProperties());

    return manager;
}

@Bean
public DataSource dataSource() {

    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/modelar_test");
    dataSource.setUsername("root");
    dataSource.setPassword("");

    return dataSource;
}

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

Properties additionalProperties() {
    Properties properties = new Properties();

    properties.put("hibernate.query.factory_class","org.hibernate.hql.classic.ClassicQueryTranslatorFactory");
    properties.put("hibernate.hbm2ddl.auto", "create-drop");
    properties.put("hibernate.dialect",
            "org.hibernate.dialect.MySQL5Dialect");
    return properties;
}

}
@Service("userService")
public class UserService implements ServiceInterface<User, Integer>{

private HibernateUserDAO userDAO;

public UserService() {
    userDAO = new HibernateUserDAO();
}
@Override
public List<User> getAll() {

    return userDAO.getAll();
}
}
@Repository
public class HibernateUserDAO implements DAOInterface<User, Integer>{

@Autowired
private SessionFactory sessionFactory;

@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
@Override
public List<User> getAll() {

    List<User> users = sessionFactory.getCurrentSession().createQuery("SELECT FROM mduser").list();

    return users;
}
}
用户服务类

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig {


@Bean
public SessionFactory sessionFactory(){

    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource());

    sessionBuilder.scanPackages("com.br.modelar.Modelar.model").addProperties(additionalProperties());
    SessionFactory sessionFactory = sessionBuilder.buildSessionFactory();

    return sessionFactory;
}

@Bean
public HibernateTransactionManager transactionManager(){

    HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory());
    return transactionManager;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    LocalContainerEntityManagerFactoryBean manager = new LocalContainerEntityManagerFactoryBean();
    JpaVendorAdapter adapter = new HibernateJpaVendorAdapter();

    manager.setDataSource(dataSource());
    manager.setPackagesToScan("com.br.modelar.Modelar.model");
    manager.setJpaVendorAdapter(adapter);
    manager.setJpaProperties(additionalProperties());

    return manager;
}

@Bean
public DataSource dataSource() {

    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/modelar_test");
    dataSource.setUsername("root");
    dataSource.setPassword("");

    return dataSource;
}

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

Properties additionalProperties() {
    Properties properties = new Properties();

    properties.put("hibernate.query.factory_class","org.hibernate.hql.classic.ClassicQueryTranslatorFactory");
    properties.put("hibernate.hbm2ddl.auto", "create-drop");
    properties.put("hibernate.dialect",
            "org.hibernate.dialect.MySQL5Dialect");
    return properties;
}

}
@Service("userService")
public class UserService implements ServiceInterface<User, Integer>{

private HibernateUserDAO userDAO;

public UserService() {
    userDAO = new HibernateUserDAO();
}
@Override
public List<User> getAll() {

    return userDAO.getAll();
}
}
@Repository
public class HibernateUserDAO implements DAOInterface<User, Integer>{

@Autowired
private SessionFactory sessionFactory;

@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
@Override
public List<User> getAll() {

    List<User> users = sessionFactory.getCurrentSession().createQuery("SELECT FROM mduser").list();

    return users;
}
}
管理员控制器-调用getAll()

@控制器
公共类管理员控制器{
@请求映射(value=“/view\u users”)
公共模型和视图用户(){
ModelAndView模型=新的ModelAndView(“管理员/显示用户”);
//UserDAO=newuserdao();
//List users=dao.getAll();
UserService=newuserservice();
List users=service.getAll();
model.addObject(“用户”,用户);
收益模型;
}
}
会话。createQuery(查询)需要有效的HQL查询字符串。我不是HQL专家,但我认为
“从mduser中选择”
是错误的。试试这个:

List<User> users = sessionFactory.getCurrentSession().createQuery("FROM mduser").list();

UserService是由Spring管理的bean:您不能这样创建它。您必须向其注入以下内容:

@Autowired
private UserService userService;
当您使用注入(而不是显式实例化)时,对象是由Spring创建的,Spring要注意正确地初始化它(在您的例子中,通过注入userDAO—请参阅下一点)

下一点

private HibernateUserDAO userDAO;
userDao没有注释:Spring不会对该字段做任何事情,这是一个问题。必须添加注释:

@Autowired
private HibernateUserDAO userDAO;
public UserService() {
    //nothing here
}
作为一般规则:永远不要自己实例化bean:Spring为你做!
(任何带有@Repository、@Service、@Component…-注释的类都是bean。)

有什么错误/stacktrace?对不起,伙计哈哈。我忘了放堆栈跟踪。我已经更新了=D谢谢你正在创建一个新的
用户DAO实例
不要这样做使用
@Autowired
来获得spring配置的实例。@M.Deinum thank you=D这和ben75指出的一些其他问题帮助解决了这个问题。它不起作用,但感谢你指出这一点=D异常发生在“sessionFactory.getCurrentSession()”处。sessionFactory在不应该为空的时候是空的,我不知道为什么hahaHi,我添加了注释@ComponentScan,作为我所有Java文件所在的根包的背包传递。然而,它并没有起到很好的作用。问题中有您的建议更新。非常感谢@ben75=D这就是问题所在!后来我遇到了一些关于我使用的界面的问题,但我做了一些研究,找到了解决办法。再次谢谢你
@Autowired
private HibernateUserDAO userDAO;
public UserService() {
    //nothing here
}