【问题标题】:JSF & Primefaces NoClassDefFoundErrorJSF 和 Primefaces NoClassDefFoundError
【发布时间】:2012-03-22 21:29:49
【问题描述】:

好的,伙计们。 经过大约 3 个小时的挣扎,我决定在这里发布问题,因为我无法解决这个问题。

让我们进入正题。

我使用 PrimeFaces 3 完成了一个 NetBeans Web 项目。 它工作正常,没有任何问题。

但我需要制作一个企业应用程序,使用该 Web 项目作为 Web 模块。

我已经有一个 EJB 部分几乎完成的 EE 项目,所以我开始“合并”这两个项目,方法是将网页复制到 Enterprise 项目的 War 部分并重写托管 Bean。

但是事情变得一团糟,所以我不得不做出一些改变。

我将编写不同版本的 2 个文件的代码(请记住,此代码在单个 Web 项目中有效!):

-- JSF 页面--

[cut]
<p:dialog id="loginDialog" header="Login" widgetVar="loginDialog" showEffect="fade" hideEffect="fade" position="center" draggable="false" resizable="false" height="220" width="300" modal="true" showHeader="false">
        <h:form id="loginForm">
            <br/>
            Username: <br/><p:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="random error message"/><br/><br/>                           
            Password: <br/><p:password id="password" value="#{loginBean.password}" required="true" requiredMessage="random error message"/><br/><br/>                                                        
            <p:commandButton value="Login" actionListener="#{loginBean.doLogin}" oncomplete="handleLoginRequest(xhr, status, args)" ajax="true" update=":growl, :loginForm, :userPanel"/> <p:commandButton value="Cancel" type="button" onclick="loginDialog.hide()" />
        </h:form><br/>                    
    </p:dialog>
[cut]

-- 托管豆--

[cut]
public void doLogin(ActionEvent ae) {
    user = loginUser.doLogin(username, password);
    loggedIn = false;
    FacesMessage msg;
    RequestContext context = RequestContext.getCurrentInstance();
    if (user != null) {
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome " + user.getUsername(), user.getUsername());
        loggedIn = true;
    } else {           
        msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Login failed", "Incorrect credentials");
    }
    FacesContext.getCurrentInstance().addMessage(null, msg);
    context.addCallbackParam("loggedIn", loggedIn);
}
[cut]

即使此代码在我的 Web 项目中有效,将其“移动”到完整的 EE 应用程序也会导致我出错:

“ManagedBeans.LoginBean”类没有“doLogin”属性。

所以,假设问题是由 doLogin 的签名引起的(它需要一个参数,但在 JSF 页面中调用时没有它),尽管这是 PrimeFaces 文档中使用组件的方式,我'已经简单地将其更改为:

-- JSF 页面--

[cut]
<p:dialog id="loginDialog" header="Login" widgetVar="loginDialog" showEffect="fade" hideEffect="fade" position="center" draggable="false" resizable="false" height="220" width="300" modal="true" showHeader="false">
        <h:form id="loginForm">
            <br/>
            Username: <br/><p:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="random error message"/><br/><br/>                           
            Password: <br/><p:password id="password" value="#{loginBean.password}" required="true" requiredMessage="random error message"/><br/><br/>                                                        
            <p:commandButton value="Login" action="#{loginBean.doLogin()}" oncomplete="handleLoginRequest(xhr, status, args)" ajax="true" update=":growl, :loginForm, :userPanel"/> <p:commandButton value="Cancel" type="button" onclick="loginDialog.hide()" />
        </h:form><br/>                    
    </p:dialog>
[cut]

-- 托管豆--

[cut]
public void doLogin() {
    user = loginUser.doLogin(username, password);
    loggedIn = false;
    FacesMessage msg;
    RequestContext context = RequestContext.getCurrentInstance();        
[cut]

所以我已经更改了方法签名和 commandButton 的操作。

通过做这个改变,之前的错误似乎消失了..但是..

java.lang.NoClassDefFoundError: org/primefaces/context/RequestContext

是的,现在我有这个了。

只是为了说明清楚,库已导入,一切都很好。 NetBeans 可以从 org.primefaces.* 正确导入,所以我假设 jar 文件已加载。

但奇怪的事情来了。

从库中删除 PrimeFaces 并导入一个新 jar(与以前相同,只是在不同的目录中)后,它似乎可以工作。

页面加载没有问题。

但这只会持续到下一次部署,因为新部署会导致我出现与以前相同的 NoDefClassFoundError。

这是一件非常随机的事情,因为在玩了一些库路径后它会得到解决,但它们都不能用于多个部署。

我不知道该怎么办,因为事情很奇怪。

有时它只是加载带有黄色警告的页面,说他找不到http://primefaces.org/ui 命名空间(或类似的东西)的库。

对于这个问题的长度很抱歉,但很难解释我所看到的。

有没有人可以指出解决方案?

【问题讨论】:

    标签: jsf netbeans ejb primefaces requestcontext


    【解决方案1】:

    这两个问题的原因完全相同:PrimeFaces JAR 文件不在运行时类路径中(为简单起见,我假设您使用的是 PrimeFaces 3.x 并且没有更改 taglib URI)。

    “ManagedBeans.LoginBean”类没有“doLogin”属性。

    诚然,第一个例外有点误导,但实际上,Facelets 根本没有解析 PrimeFaces 组件,而是将其视为纯文本/html。 内嵌在 PrimeFaces 组件标记中的任何 EL 表达式将被解析为值表达式。这就像您在模板文本中编写 EL 纯文本一样 &lt;p&gt;#{loginBean.doLogin}&lt;/p&gt;。然后它会寻找getDoLogin() 方法以打印其结果。

    java.lang.NoClassDefFoundError: org/primefaces/context/RequestContext

    第二个异常让您更接近问题的真正解释:包含上述类的 JAR 文件不在 webapp 的运行时类路径中。

    确保 PrimeFaces JAR 文件存在于 web 应用的部署的 /WEB-INF/lib 文件夹中。

    【讨论】:

    • 你肯定是对的,因为它现在可以工作了,但是为什么第一个 web 项目甚至没有 WEB-INF/lib 目录就可以工作?
    • 我没有使用Netbeans,但是你不应该看项目中的文件夹,可能Netbeans隐藏或更改它,但你应该看部署中的文件夹。这就是运行时的全部内容。导出到 WAR/EAR,看看你自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2014-09-29
    • 2012-04-29
    相关资源
    最近更新 更多