好,朋友们。经过 3 个小时的挣扎,我决定在这里发布问题,因为我无法解决这个问题。
让我们进入正题。
我用 PrimeFaces 3 完成了一个 NetBeans Web 项目。它工作正常,没有任何问题。
但我需要制作一个企业应用程序,使用该 Web 项目作为 Web 模块。
我已经有一个 EJB 部分几乎完成的 EE 项目,因此我开始“合并”这两个项目,方法是将网页复制到 Enterprise 项目的 War 部分并重写 Managed Beans。
但事情变得一团糟,所以我不得不做出一些改变。
我将编写不同版本的 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命名空间(或类似的东西)的库。
对于问题的长度,我很抱歉,但很难解释我所看到的。
有没有人可以指出我的解决方案?