JavaEE + eclipseLink + TomEE 给出 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象

Posted

技术标签:

【中文标题】JavaEE + eclipseLink + TomEE 给出 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象【英文标题】:JavaEE + eclipseLink + TomEE gives java.sql.SQLSyntaxErrorException: user lacks privilege or object not found 【发布时间】:2016-06-21 20:53:21 【问题描述】:

我尝试使用 rest 服务、eclipseLink 和 mysql 制作一个简单的应用程序。 我想让它在 TomEE 服务器上运行 (apache-tomee-plume-1.7.4)。

我使用 eclipse 部署应用程序。

部署好像没问题

当我转到http://localhost:8080/eleve/ 时,我得到了:

javax.servlet.ServletException: Error processing webservice request
    org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:98)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

java.io.IOException: Failed to invoke AbstractHTTPDestination
    org.apache.openejb.server.cxf.rs.CxfRsHttpListener.doInvoke(CxfRsHttpListener.java:229)
    org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:94)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: 
Internal Exception: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: ELEVE
Error Code: -5501
Call: SELECT ID, ADRESSE, classe, date_naissance, NOM, PRENOM, SEXE FROM ELEVE
Query: ReadAllQuery(referenceClass=Eleve sql="SELECT ID, ADRESSE, classe, date_naissance, NOM, PRENOM, SEXE FROM ELEVE")
    org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116)
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:324)
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:240)
    org.apache.openejb.server.cxf.rs.CxfRsHttpListener.doInvoke(CxfRsHttpListener.java:227)
    org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:94)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

这是我的 persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0"
        xmlns="http://java.sun.com/xml/ns/persistence"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="notePU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.test.eleve.model.Eleve</class>
        <properties>
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/notes_eleves" />
            <!-- <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> -->
            <property name="eclipselink.logging.level" value="INFO" />
        </properties>
    </persistence-unit>
</persistence>

我一定错过了什么,但我找不到什么。

我在这里推送了我的代码:gitlab

感谢您的帮助

【问题讨论】:

你好,你的表ELEVE是否存在于MySQL数据库中? 不应该是 transaction-type="JTA" 而不是 transaction-type="RESOURCE_LOCAL"? 你好,是的,它存在并且查询“SELECT ID, ADRESSE, classe, date_naissance, NOM, PRENOM, SEXE FROM ELEVE”返回我在 mysql 控制台中的期望 @leo 为什么应该是JTA? 因为我想你想让 tomee 处理持久性——见tomee.apache.org/jpa-concepts.html 【参考方案1】:

我终于设法让它在 TomEE 1.7 和 7 上运行。

这是我必须做的改变:

从persistence.xml中删除数据库相关属性 在persistence.xml中用jta-data-source替换非jta-data-source标签 将mysql连接器jar放到我的服务器/lib中 在我的服务器 /conf/tomee.xml 中,我已将 myDatasource 配置添加为资源。 将 @XmlRootElement(name = "eleve") 放在我的 Eleve 实体上(这似乎只在 TomEE

最后我认为我的问题是需要在 EE 上下文中的服务器 conf 中配置数据源(我认为持久性中的数据源属性只是忽略,所以就像没有人声明一样)和异常

用户缺少权限或找不到对象

来自以下事实:

如果应用程序需要一个 DataSource 而没有声明一个, TomEE 将使用默认设置动态创建一个。

TomEE documentation

我不是 100% 肯定这个解释,但至少问题已经解决了,如果我误解了一些东西,请不要犹豫。

我已经更新了gitlab project

编辑:请注意,您还可以在 /WEB-INF/resources.xml 文件中配置资源

编辑 2: 如果您使用的是 Eclipse,如果您错误地配置了您的服务器位置,您也可能会遇到这个问题,它应该设置为“使用 Tomcat 安装(控制...)”并且不是“使用工作区元数据”

【讨论】:

以上是关于JavaEE + eclipseLink + TomEE 给出 java.sql.SQLSyntaxErrorException: 用户缺少权限或找不到对象的主要内容,如果未能解决你的问题,请参考以下文章

Up-to-date cache with EclipseLink and Oracle

使用 MariaDB 10.4 和 eclipselink 的 java @GeneratedValue (strategy = GenerationType.IDENTITY) 问题

JPA eclipselink坚持没有主键但有两个外键的实体

EclipseLink 不删除私有的一对多项目

TypedQuery<String> 上的 NullPointerException -- JavaEE Spring JPA2.1

ArtifactTransferException: Failure to transfer org.apache.openejb:javaee-api:jar:5.0-1