当前位置: 首页 > 知识库问答 >
问题:

Spring JNDIDataSourceLookup未能在Glassfish中查找JNDSI数据源?

孔征
2023-03-14

每当我尝试将我的Spring war应用程序部署到Glassfish服务器(使用Glassfish 4和5)时,我都会遇到一个错误:

但是,如果我直接从Eclipse运行应用程序,一切都很好。我的项目是Maven项目,我只需右键单击项目并选择Run As-

这是我的glassfish-resources.xml,它位于WEB-INF文件夹中,并包含在部署中(我已经验证过)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_pos_rootPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
        <property name="serverName" value="localhost"/>
        <property name="portNumber" value="3306"/>
        <property name="databaseName" value="pos"/>
        <property name="User" value="root"/>
        <property name="Password" value="root"/>
        <property name="URL" value="jdbc:mysql://localhost:3306/pos?zeroDateTimeBehavior=convertToNull"/>
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    </jdbc-connection-pool>
    <jdbc-resource enabled="true" jndi-name="java:app/pos" object-type="user" pool-name="mysql_pos_rootPool"/>
</resources>

我的RootContextConfiguration类中的bean:

@Bean
public DataSource springJpaDataSource()
{
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    return lookup.getDataSource("java:app/pos");
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
    Map<String, Object> properties = new Hashtable<>();
    properties.put("javax.persistence.schema-generation.database.action",
            "none");

    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");

    LocalContainerEntityManagerFactoryBean factory =
            new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(adapter);
    factory.setDataSource(this.springJpaDataSource());
    factory.setPackagesToScan("my.package.entity");
    factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
    factory.setValidationMode(ValidationMode.NONE);
    factory.setJpaPropertyMap(properties);
    return factory;
}

错误如下:

“部署期间发生错误:加载应用程序时发生异常:java.lang.IllegalStateException:ContainerBase.addChild:start:org.apache.catalina.LifecycleException:org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactoryBean”的bean时出错,该bean在类sunwell.pos.service.config.RootContextConfiguration中定义:bean实例化失败;嵌套异常tion是组织。springframework。豆。工厂BeanDefinitionStoreException:工厂方法[public org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean sunwell.pos.service.config.RootContextConfiguration.entityManagerFactoryBean()]引发异常;嵌套异常为org。springframework。豆。工厂BeanCreationException:创建名为“springJpaDataSource”的bean时出错,该bean在类sunwell中定义。pos.服务。配置。RootContextConfiguration:bean实例化失败;嵌套异常为org。springframework。豆。工厂BeanDefinitionStoreException:工厂方法[public javax.sql.DataSource sunwell.pos.service.config.RootContextConfiguration.springJpaDataSource()]引发异常;嵌套异常为org。springframework。jdbc。数据源。查找。DataSourceLookupFailureException:无法查找名为“java:app/pos”的JNDI数据源;嵌套异常为org。springframework。jndi。TypeMismatchNamingException:JNDI位置[java:app/pos]上可用的[class com.sun.enterprise.naming.impl.SerialContext]类型的对象不能分配给[javax.sql.DataSource]。请参阅服务器。有关详细信息,请登录。"

编辑:

我发现在部署过程中,jndi名称必须以jdbc或命名空间后面的东西为前缀,例如:java: app/jdbc/pos而不仅仅是java: app/pos,但是我不确定为什么即使没有jdbc前缀也可以使用eclipse运行它,并且在JEE应用程序中我也可以像这样在持久性中引用jndi名称

所以归根结底,这个问题只会发生在Spring战争部署期间。解决方案是,您需要在名称空间后面的jndi名称前面加上jdbc之类的前缀。


共有1个答案

丁俊智
2023-03-14
匿名用户

已解决此问题

在玻璃鱼资源中。xml,

将jndi名称更改为

并且在springJpaDataSource()方法中,

更改返回lookup.getDataSource("java: app/pos");

返回lookup.getDataSource("java: app/jdbc/pos");

然而,我仍然不明白为什么在glassfish资源中都指定java:app/pos。如果我从Eclipse运行xml和springJpaDataSource,但如果我真的部署它,xml和springJpaDataSource就不能工作,而且在JEE应用程序中,我可以在glassfish资源中为java:app/pos提供jndi名称。xml并在持久性中引用它。像这样的xml<代码>

 类似资料:
  • d>f=spark\....readstream\....format(“Kafka”)\... .选项(“kafka.bootstrap.servers”,“localhost:9092”)\... .选项(“subscribe”,“data_wm”)\....load()跟踪(最近的调用):文件“,第5行,在文件”/usr/local/spark/python/pyspark/sql/stre

  • 我想在WebSphere中配置的webapp中使用JDBC Connetion。(就像这里的这个:如何在JavaEE中使用JDBC?) 我以前通过JPA使用过此数据源,但我们的客户希望使用本机SQL。。。不要问。 我找到了很多例子和教程(例如。http://www.wickcentral.com/java/dl/ds_resreferencesetts_Websphere.pdf,Webspher

  • 我正在尝试向glassfish服务器添加JDBC资源,但无法ping它。我尝试了本教程,但似乎找不到JDBC驱动程序。 我得到以下错误: 类名错误或类路径未设置为:org.sqlite.SQLiteConnectionPoolDataSource 我在另一篇关于stackoverflow的帖子中读到,我必须在“glassfish4/glassfish/domains/[domainname]/li

  • 问题内容: 目前,我正在尝试学习docker,但对于 数据量实际存在的位置感到困惑。 我正在使用Windows的Docker Desktop。(Windows 10) 他们在文档中说,在对象上运行docker inspect将为您提供 源https://docs.docker.com/engine/tutorials/dockervolumes/#locating-a-volume 但是我没有看到

  • 问题内容: 我有这种表,找到最大的标记 学生 外面应该是这样的 但我得到这种输出 我用SQL写这个 我该如何纠正sql? 问题答案: 在SQL Server中,您可以使用 尽管您也可以使用逻辑上等效的标准SQL

  • 我现在正试图学习docker,但我对数据卷实际存在的位置感到困惑。 我使用Docker桌面的Windows。(Windows 10) 在文档中,他们说对对象运行docker检查会给你提供来源:https://docs.docker.com/engine/tutorials/dockervolumes/#locating-a-volume 但是,我没有看到这一点,我得到以下信息: 有人能帮帮我吗?我