4

ご覧のとおり、データベースにデータを永続化するために使用する HibernateUtil があります。userBean.save メソッドで使用するコードは、junit テストで使用するコードと同じです。以下の私のjunitテストでは、完全に機能します。ただし、コマンドボタンで userBean.save メソッドを呼び出そうとすると、エラー org.hibernate.HibernateException: /hibernate.cfg.xml not found が表示されます。

デバッグを行った後、hibernateUtil クラスの configuration.configure().addAnnotatedClass(userBean.class); でエラーが発生したことがわかります。

コマンドボタンのアクションをウェルカムページの名前であるウェルカムに変更すると、ウェルカムページにリダイレクトされてフォームが正常に機能し、ページに Bean 値が出力されます。これは、私が知る限り、Bean が正しく初期化されたことを意味します。これは非常に紛らわしいですが、jsf ページではなく、junit テストで機能するのはなぜですか?

public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static ServiceRegistry serviceRegistry;

private static SessionFactory buildSessionFactory() {
    try {

        Configuration configuration = new Configuration();
        configuration.configure().addAnnotatedClass(userBean.class);
        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        // Create the SessionFactory from hibernate.cfg.xml
        return sessionFactory; 
    }
    catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

}

package Beans;
import javax.faces.bean.ManagedBean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.*;
import controller.HibernateUtil;
import javax.persistence.Table;

@ManagedBean
@Entity
@Table(name = "userBean")
public class userBean {

@Id @GeneratedValue
private int id;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private String name;
private int age=0;

public String getName() {
return name;
}
public void setName(String n) {
this.name = n;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

//Methods
public void save(){
//HibernateUtil.getSessionFactory().close();
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();

userBean u=new userBean();
u.setName("saveName");
u.setAge(20);

session.save(u);

session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();

}
}

Junittest.java

public void test2(){

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        userBean u=new userBean();
        u.setName("tommy");
        u.setAge(20);

        session.save(u);

        session.getTransaction().commit();
        HibernateUtil.getSessionFactory().close();
}    

index.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>JSF 2: Blank Starting-Point Project</title>
<link href="./css/styles.css" 
  rel="stylesheet" type="text/css"/> 
</h:head>
<h:body>
<h:form>
<h:inputText id="it" value="#{userBean.name}"/>
<h:commandButton id="btn" value="Submit" action="#{userBean.save}"/>
</h:form>
</h:body>
</html>

詳しくは

私が言ったように、問題は configuration.configure().addAnnotatedClass(userBean.class); から来ています。

そこで、デバッガーを使用して、このコードをクロスしたときのコンソール出力をコピーしました。動作中の Junit テストからの出力は次のとおりです。

000021: Bytecode provider name : javassist
Mar 24, 2013 2:10:21 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
Mar 24, 2013 2:10:21 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
Mar 24, 2013 2:10:21 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity
WARN: HHH000223: Recognized obsolete hibernate namespace        http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/   instead.   Refer to Hibernate 3.6 Migration Guide!
Mar 24, 2013 2:10:21 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null

これは、動作していないjsf実行中のコードです

14:23:03,988 INFO  [org.hibernate.cfg.Configuration] (http-localhost-127.0.0.1-8080-2) HHH000043: Configuring from resource: /hibernate.cfg.xml
14:23:03,998 INFO  [org.hibernate.cfg.Configuration] (http-localhost-127.0.0.1-8080-2) HHH000040: Configuration resource: /hibernate.cfg.xml
14:23:04,057 ERROR [stderr] (http-localhost-127.0.0.1-8080-2) Initial SessionFactory   creation failed.org.hibernate.HibernateException: /hibernate.cfg.xml not found

実際、これはフォルダー構造の画像で、src とデプロイされたリソースも示しています ここに画像の説明を入力

4

1 に答える 1

2

この問題の原因は、JUnit が を見つけられないことhibernate.cfg.xmlです。これは、すべての*.xmlリソースをWEB-INF/classesフォルダーに配置するために発生します。この場合、これらのリソースは Web アプリケーションのクラスパスで表示されますが、JUnit テストでは表示されません。

解決策として、次のようにすることをお勧めします。

  1. すべての*.xmlリソースWEB-INF/classesをソース フォルダーのルートに移動します。
  2. *.xmlコンパイラがファイルを無視しないことを確認してください

最終結果として、*.xmlとにかくリソースはフォルダになりますが、通常のクラスパスWEB-INF/classesからそれらのリソースを取得することもできます。

ファイルを移動する必要があることに注意してください。そうしないと、バージョンの競合が発生する可能性があります。

于 2013-03-25T09:28:12.250 に答える