4

InvalidObjectException: Could not find a SessionFactory named: nullTomcatサーバーの再起動後に取得しています。

私はいくつかの可能な解決策を見つけました:

この例外は、切断された Hibernate セッションをシリアライズして別の VM でデシリアライズしようとした場合、またはクラスローダーが再起動した場合 (アプリケーション サーバーまたは Web コンテナーでのホット再デプロイ中など) に発生します。これは Tomcat で特に顕著です。アプリケーション サーバーでは、ドキュメントに記載されているように、常に JNDI を使用して SessionFactory を格納します。Tomcat またはその他の Web コンテナーで、 コンテキストの再読み込み中の HttpSession シリアライゼーションを無効にします。これには、Web コンテナーのドキュメントで説明されている副作用があります。

どうすればいいですか?コンテキストのリロード中に HttpSession シリアライゼーションを無効にしますか?

注: Eclipse で Tomcat7 を使用しています。

アップデート:

でこのタグを有効にしようとしましたcontext.xml:

<Manager pathname="" />

はい、例外は消えますが、永続的なセッションが失われるため、Tomcat サーバーの再起動後に再度ログインする必要があります。

JSFアプリケーションなどでTomcatを再起動した後、セッションを維持する必要がある(ログインによって新しいセッションを作成してはならない)と私が信じている場合、セッションの永続性をよく理解していますか?

UPDATE2 (セッションマネージャー):

@SessionScoped
@ManagedBean(name="userManager")
public class UserManager implements Serializable {
  private static final long serialVersionUID = 1L;
  private transient HttpSession session;
  private String username;
  private String password;
  private User user;

  public String login() {
    // here is seraching for user in database (based on username and password)

    if (user != null) {
      FacesContext context = FacesContext.getCurrentInstance();
      session = (HttpSession) context.getExternalContext().getSession(true);
      session.setAttribute("id", user.getId());
      session.setAttribute("username", user.getName());
      ...
      return "success";
    } 
  }

  public String logout() {
    user = null;
    FacesContext context = FacesContext.getCurrentInstance();
    session = (HttpSession) context.getExternalContext().getSession(true);
    ...     
    session.invalidate();
    return "success";
  }
  // getters and setters ----------------------------------------------------
}

そして私のhibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
 <session-factory>
  <property name="connection.url">jdbc:sqlserver://localhost;databaseName=RXP</property>
  <property name="connection.username">user</property>
  <property name="connection.password">password</property>
  <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
  <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
  <property name="current_session_context_class">thread</property>
  <property name="hibernate.show_sql">true</property>
  <property name="hibernate.hbm2ddl.auto">update</property>

  <mapping class="tables.User"/>

 </session-factory>
</hibernate-configuration>

そして私のセッションファクトリー

public final class DaoSF implements Serializable {
  private static final long serialVersionUID = 1L;

  private static SessionFactory sessionFactory;
  private static ServiceRegistry serviceRegistry;

  public static SessionFactory getSessionFactory() {
    try {
      Configuration configuration = new Configuration();
      configuration.configure("hibernate.cfg.xml");
      serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
      sessionFactory = configuration.buildSessionFactory(serviceRegistry);
      return sessionFactory;
    }
    catch (HibernateException he) { 
      ...
    }
  }
}
4

2 に答える 2

7

次のように入力することで、それをオフにできるはずです。

<Manager pathname="" />

Tomcat 構成ファイルの Context セクション内。

Tomcat のドキュメントを参照してください: [
構成リファレンス] > [マネージャー コンポーネント] > [セッションの持続性を無効にする]

于 2012-07-01T06:32:30.777 に答える
0

Codoの答えは正しいです。

上記のタグを実装する例を次に示します。

Web アプリのMETA-INFフォルダー内のcontext.xmlファイル:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="">
    <Manager pathname=""/>
</Context>
于 2016-05-17T04:26:50.440 に答える