2013-11-03 103 views
0

這可能是非常基本的,但我堅持了幾個小時,所以請聽我說。Glassfish 4 JBDCRealm NameNotFoundException

我想在Eclipse中的Glassfish 4.0上的Java 7 Web應用程序中進行基於JDBCRealm的身份驗證。此博客post是用於配置JDBCRealm的參考。

web.xml中是遵循

<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>MyJDBCRealm</realm-name> 
    <form-login-config> 
    <form-login-page>/login.html</form-login-page> 
    <form-error-page>/tologin.html</form-error-page> 
    </form-login-config> 
</login-config> 

當我啓動GlassFish服務器它清楚地寫在控制檯:

SEC1115: Realm [MyJDBCRealm] of classtype [com.sun.enterprise.security.ee.auth.realm.jdbc.JDBCRealm] successfully created. 

但是,當我請求任何應用程序的資源,我得到這個例外

javax.naming.NamingException: Lookup failed for 'MyJDBCRealm' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: MyJDBCRealm not found] 

與根源:

javax.naming.NameNotFoundException: MyJDBCRealm not found 
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204) 
    ... 

這發生在這裏

public DataSource getDataSource() { 
    DataSource datasource = null; 

    try { 
    datasource = (DataSource) initialContext.lookup("MyJDBCRealm"); 
    } catch (NamingException ex) { 
    ex.printStackTrace(); 
    } 

    return datasource; 
} 

我要指出的是,Hibernate的成功連接到後端數據庫和表映射,並在GlassFish控制檯,我可以成功地ping JDBC連接池。

回答

1

我想你是在混淆東西。

一個領域與數據源不是一回事。爲了得到一個境界的實例在Java中,你可以做到以下幾點:

JDBCRealm realm = (JDBCRealm) Realm.getInstance("realmName"); 

如果你真的想你必須使用JNDI名稱的數據源,這往往與jdbc/這樣開始:

DataSource datasource = (DataSource) initialContext.lookup("jdbc/MyJDBCRealm"); 

但無論如何,我認爲對於正常的基於JDBC的認證,你不需要這樣的東西。