JSF& Primefaces NoClassDefFoundError

时间:2012-03-22 21:29:50

标签: jsf netbeans ejb primefaces requestcontext

好的伙计们。 经过3个小时的奋斗之后,我决定在这里发布这个问题,因为我无法解决这个问题。

让我们谈谈。

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

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

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

但事情变得混乱所以我不得不做出一些改变。

我将以不同的版本编写2个文件的代码(请记住,这个代码在单个Web项目中工作!):<​​/ p>

- JSF PAGE -

[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]

- MANAGED BEAN -

[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 PAGE -

[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]

- MANAGED BEAN -

[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命名空间的库(或类似的东西)。

我很抱歉问题的长度,但很难解释我所看到的内容。

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

1 个答案:

答案 0 :(得分:6)

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

  

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

第一个例外肯定有些误导,但实际上PrimeFaces组件根本没有被Facelets解析并被视为纯文本/ html。 在PrimeFaces组件标记中内联的任何 EL表达式将被解析为值表达式。这就像你在模板文本中编写EL plain一样<p>#{loginBean.doLogin}</p>。然后它正在寻找getDoLogin()方法以打印其结果。

  

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

第二个例外使您更接近问题的真实解释:包含所提到的类的JAR文件不在webapp的运行时类路径中。

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