繁体   English   中英

Glassfish 4 JBDCRealm NameNotFoundException

[英]Glassfish 4 JBDCRealm NameNotFoundException

这可能是非常基本的,但是我已经坚持了几个小时,所以请听我说。

我正在尝试在Eclipse的Glassfish 4.0上的Java 7 Web应用程序中执行基于JDBCRealm的身份验证。 这篇博客文章是用于配置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连接池。

我猜你在弄糊涂。

领域与数据源不是一回事。 要获取Java领域的实例,可以执行以下操作:

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

如果您确实想要获取数据源,则必须使用JNDI名称,该名称通常以jdbc/开头,如下所示:

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

但是无论如何,我认为对于基于JDBC的常规身份验证,您不需要这样的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM