【问题标题】:JBOSS eap 7.0 unable to locate javax.faces.model.SelectItem class in JPA queryJBOSS eap 7.0 无法在 JPA 查询中找到 javax.faces.model.SelectItem 类
【发布时间】:2017-11-18 13:39:00
【问题描述】:

enter image description here我有一个在 JBOSS AS 6.1 中工作的 EAR 项目(JSF/RICH FACES,JPA 2.0),我必须迁移到 JBOSS EAP 7.0。在部署时,我在创建持久性单元期间遇到以下错误。

**"[PersistenceUnit: changecdb] Unable to build Hibernate SessionFactory
    Caused by: javax.persistence.PersistenceException: [PersistenceUnit: changecdb] Unable to build Hibernate SessionFactory
    Caused by: org.hibernate.HibernateException: Errors in named queries: getSubReports, getAllReports"}}}} "**

日志显示以下错误:

**"ERROR [org.hibernate.internal.SessionFactoryImpl] (ServerService Thread Pool -- 101) HHH000177: Error in named query: getSubReports: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [javax.faces.model.SelectItem] [select new javax.faces.model.SelectItem(r.id,r.name) from com.centurylink.changecejb.entity.Report r where r.id<>? order by r.name asc]
        at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
"**

以下是包含命名查询的源文件:

package com.centurylink.changecejb.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import javax.persistence.NamedQueries;

@SequenceGenerator(name="reportSequence",sequenceName="rep_seq")
@Entity
@NamedQueries({@NamedQuery(name="getAllCustomReports",query="select new com.centurylink.changecejb.bean.SelectBean(r.id,r.name) from Report r order by r.name asc")
,@NamedQuery(name="getCustomReportForAId",query="from Report r where r.id=? ")
,@NamedQuery(name="getSubReports",query="select new javax.faces.model.SelectItem(r.id,r.name) from Report r where r.id<>? order by r.name asc"),
@NamedQuery(name="getAllReports",query="select new javax.faces.model.SelectItem(r.id,r.name) from Report r order by r.name asc"),
@NamedQuery(name="updateCustomReport",query="update Report r  set r.name=:name where r.id=:id")

,@NamedQuery(name="deleteCustomReport",query="delete Report report where report.id=:id")})
@Table(name="report_table")
public class Report {
    private String filename;
    private String name;
    @Id
    @GeneratedValue(generator="reportSequence",strategy=GenerationType.SEQUENCE)
    private int id;
public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

}

我没有包含 JSF api 和 impl ,我确实尝试将它们包含在我的 lib 文件夹中,但仍然遇到相同的错误。 请帮忙

更新:

以下是我的图书馆列表:

common-annotations.jar
commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-logging.jar
cssparser-0.9.5.jar
guava-10.0.1.jar
guava-gwt-10.0.1.jar
jsonplugin-0.32.jar
jstl.jar
poi-3.6-20091214.jar
richfaces-components-api-4.2.0.Final.jar
richfaces-components-ui-4.2.0.Final.jar
richfaces-core-api-4.2.0.Final.jar
richfaces-core-impl-4.2.0.Final.jar
sac-1.3.jar
standard.jar

下面是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">

    <persistence-unit name="changecdb" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/changec</jta-data-source>
        <class>com.centurylink.changecejb.entity.Report</class>

    </persistence-unit>
</persistence>

我想知道这是否是由于 EAP 7.0 具有 Hibernate 5.0 而 AS6.1 具有 Hibernate 3.6 和/或 JSF 2.2 vs JSF 1.2

更新: 在从 Gabriel 的回答中获取问题时,我搜索了 EAP 7 库,发现已经提供了一半的库。我从我的 LIB 中删除了 EAP 7 已经提供的库,但我仍然遇到同样的错误。 由于某种原因,HIBERNATE 5.0 不能加载类 javax.faces.model.SelectItem

我确认该类存在于 jaxax/faces 模块下的 EAP 7.0 库之一 jboss-jsf-api_2.2_spec-2.2.12.redhat-1.jar

以下是我当前的 lib 文件夹内容:

commons-digester.jar
commons-logging.jar
cssparser-0.9.5.jar
jsonplugin-0.32.jar
poi-3.6-20091214.jar
richfaces-components-api-4.2.0.Final.jar
richfaces-components-ui-4.2.0.Final.jar
richfaces-core-api-4.2.0.Final.jar
richfaces-core-impl-4.2.0.Final.jar
sac-1.3.jar

作为一种解决方法,我正在考虑提供自己的 JSF (1.2) 和 Hibernate (3.6) 库,并在 Standalone.xml 中禁用 EAP。

欢迎提出任何其他想法/建议。

【问题讨论】:

    标签: java hibernate jpa jboss


    【解决方案1】:

    这可能是与类路径相关的问题,可能加载了同一个类的两个版本。 检查您的战争中是否没有包含服务器提供的 jar。 你能添加你的库设置吗?

    我看到您有平台提供的 jstl.jar 和 standard.jar。不确定这些 jars 是否包含有问题的类,但无论如何您需要删除它们。

    更新

    据我所知,JBoss EAP 应该符合 JEE6,因此它应该使用 JSF 2.0,并且迁移到 JBoss EAP(符合 JEE7 的 JSF 2.2)应该很轻松。

    但是您指出您使用的是 JSF 1.2,我猜您正在使用 JBoss EAP 6 中的兼容模式,如 blog 中所述。

    Wildfly/JBoss EAP 7 似乎不再支持 JSF 1.2,请查看 this page 以获取有关如何添加自定义 JSF 版本的说明。

    【讨论】:

    • 删除了一些由 EAP 提供的罐子,包括你提到的罐子。仍然得到同样的错误。检查更新的帖子。
    • 我认为您将 AS 6.1 误读为 EAP 6.0。我正在尝试从(社区版本)AS 6.1 迁移到 EAP 7.0,因此它使用的是 JSF 1.2。我只是删除了所有与 JSF 相关的 jars,但有些类不是由 namedquery 加载的。我想我应该首先测试一个 JSF hello world 以确保它正在读取 EAP 7.0 提供的 JSF 库
    • 你说得对,我看错了。您需要提供您的自定义 JSF 版本。
    • 我在这里试图理解,为什么当我没有为 hibernate 或 jsf 提供自定义 jar 时,eap hibernate 类加载器无法在 eap 模块中找到 jsf 类。命名查询是静态的,因此在部署期间会被验证和加载。我还需要做些什么来加载 eap 提供的模块。我的应用没有使用 maven。
    猜你喜欢
    • 2018-11-04
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2019-03-30
    相关资源
    最近更新 更多