JSF & Primefaces NoClassDefFoundError - PullRequest
       27

JSF & Primefaces NoClassDefFoundError

1 голос
/ 23 марта 2012

Хорошо, ребята.После примерно 3 часов борьбы я решил опубликовать вопрос здесь, поскольку я не могу решить эту проблему.

Давайте перейдем к делу.

У меня есть NetBeansвеб-проект выполнен с помощью PrimeFaces 3. Он работает правильно, никаких проблем нет.

Но мне нужно создать корпоративное приложение, используя этот веб-проект в качестве веб-модуля.

У меня уже естьEE-проект с EJB-частью почти завершен, поэтому я начал «объединять» два проекта, копируя веб-страницы в военную часть проекта Enterprise и переписывая Managed Beans.

Но все получилосьгрязно, поэтому мне пришлось внести некоторые изменения.

Я напишу код из 2 файлов в разных версиях (помните, что этот код работает в одном веб-проекте!):

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

- Управляемый бин -

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

Даже если этот код работает в моем веб-проекте, «перемещение» его в полное приложение 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]

- MANAGEDBEAN -

[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 Ответ

6 голосов
/ 23 марта 2012

Обе проблемы имеют одну и ту же причину: JAR-файл PrimeFaces отсутствует в пути к классам среды выполнения (для простоты я предполагаю, что вы используете PrimeFaces 3.x и не изменили URI taglib).

У класса 'ManagedBeans.LoginBean' нет свойства 'doLogin'.

Первое исключение, по общему признанию, несколько вводит в заблуждение, но в действительности компоненты PrimeFaces не былиразрешено Facelets вообще и рассматривается как обычный текст / HTML. Любое EL-выражение, встроенное в разметку компонента PrimeFaces, будет затем разрешено как выражение значения.Это похоже на то, как вы пишете EL в текстовом шаблоне, например <p>#{loginBean.doLogin}</p>.Затем он ищет метод getDoLogin(), чтобы напечатать его результат.

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

Второе исключениеприближает вас к реальному объяснению проблемы: файл JAR, содержащий упомянутый класс, отсутствует в пути к классам среды выполнения веб-приложения.

Убедитесь, что файл JAR PrimeFaces присутствует в папке /WEB-INF/lib веб-приложения наразвернуть.

...