Struts + Hibernate: @SessionTarget не работает

Я использую struts2-fullhibernatecore-plugin-2.2.2-GA.jar ввести session в моем классе DAO, как показано ниже:

public class UserDAO {
    @SessionTarget
    Session session;

    @TransactionTarget
    Transaction transaction;

    public List<User> getUsers() {
        return session.createQuery("from user").list();
    }
}

Но я получил

java.lang.NullPointerException
  com.wudi.DAO.UserDAO.getUsers(UserDAO.java:28)
  com.wudi.action.UserListAction.execute(UserListAction.java:24)
  sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  java.lang.reflect.Method.invoke(Method.java:606)
  ...

Согласно результатам отладки, session а также transaction в UserDAO являются null,

Некоторые файлы для справки:

User.java:

@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @GeneratedValue
    private int id;

    @Column
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

UserListAction.java:

public class UserListAction extends ActionSupport {
    private List<User> users;
    private UserDAO userDAO = new UserDAO();

    @Override
    public String execute() throws Exception {
        users = userDAO.getUsers();
        return SUCCESS;
    }

}

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sample?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.pool_size">10</property>

    <mapping class="com.wudi.model.User" />
  </session-factory>
</hibernate-configuration>

1 ответ

Решение

Если вы хотите использовать возможность внедрения Hibernate Session и Transaction, ваш пакет отображения действий должен расширить пакет hibernate-default,

Подробнее о hibernate-default пакет

Плагин предоставляет пакет сопоставления под названием hibernate-default, И это имеет три стека перехватчиков, указанных для возможностей инъекции:

  • basicStackHibernate: Нравится Struts2basickStack (НИКАКИХ проверок!), Но с возможностью Hibernate-сессии и внедрения транзакций.

  • defaultStackHibernate: Нравится Struts2 defaultStack, но без методов проверки Struts2 (аннотации и XML). Вместо этого использует фреймворк Hibernate Validation.

  • defaultStackHibernateStrutsValidation: Struts2 defaultStack+ плагин basicStackHibernate,

Этот пакет расширяет hibernate-default пакет, так что все конфигурации Struts2 по умолчанию могут быть использованы при необходимости.

hibernate-default Пакет является абстрактным, так что вы можете расширить это с другими. Например:

<package name="default" extends="hibernate-default,json-default" >

Использовать hibernate-default с использованием конфигурации аннотации

@ParentPackage("hibernate-default")
@InterceptorRef("basicStackHibernate")
public class YourAction extends ActionSupport {}
Другие вопросы по тегам