Пример JSF CDI с сервером свободы не работает

Я создал простой пример с JSF+CDI+Liberty Server, но я всегда получаю сообщение о том, что цель моего bean-компонента недоступна, и я не понимаю, почему.

Я реализовал следующие библиотеки:

  • javaee-api-7.0.jar
  • javax.servlet-api-3.1.0.jar
  • jsf-апи-2.2.12.jar
  • jsf-импл-2.2.2.jar

Я использую Java 1.8 с сервером приложений WebShere 18.0.0.2.

Если я запускаю приложение, я вижу поля ввода, но когда я что-то ввожу и нажимаю кнопку отправки, я всегда получаю следующую ошибку:

SRVE0777E: Исключение, вызванное классом приложения 'javax.faces.webapp.FacesServlet.service:659' javax.servlet.ServletException: /pages/index.xhtml @12,72 value="#{userBean.firstName}": Target Unreachable, идентификатор 'userBean' разрешен к нулю

Может с версиями что-то не так?

UserBean.java

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class UserBean {

    private String firstName;
    private String lastName;

    //Getter and Setter

}

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:body>

    <h1>JSF 2.2 CDI Managed Bean</h1>

    <h:form>
        <h:panelGrid columns="2">
            <h:outputLabel value="First name" for="firstName"/>
            <h:inputText id="firstName" value="#{userBean.firstName}"/>

            <h:outputLabel value="Last name" for="lastName"/>
            <h:inputText id="lastName" value="#{userBean.lastName}"/>
            <h:commandButton action="result" value="send"/>
        </h:panelGrid>
    </h:form>

</h:body>
</html>

результат.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:body>

    <h1>JSF 2.2 CDI Managed Bean</h1>

    First name: #{userBean.firstName}
    Last name: #{userBean.lastName}

</h:body>
</html>

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans bean-discovery-mode="all" version="1.1"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">



</beans>

веб.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">

    <display-name>JavaServerFaces</display-name>

    <!-- Welcome page -->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

лица-config.xml

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

</faces-config>

person ak4784    schedule 08.05.2019    source источник
comment
Какие функции Liberty вы включили? И какие библиотеки (если есть) вы связываете с приложением?   -  person wtlucy    schedule 08.05.2019
comment
Я включил следующие функции: jsp-2.2, localConnector-1.0, jdbc-4.0, jndi-1.0, jaxws-2.2, concurrent-1.0 и поместил библиотеки, описанные выше, в WebContent/WEB-INF/lib.   -  person ak4784    schedule 08.05.2019


Ответы (1)


WebSphere Liberty предоставляет свои собственные функции JSF — jsf-2.0, jsf-2.2 и jsf-2.3 — которые позволяют приложениям использовать соответствующие реализации MyFaces. Эти функции интегрированы с функциями CDI, предоставляемыми сервером, так что включение jsf-2.2 вместе с cdi-1.2 позволит этому типу приложений работать без каких-либо дополнительных включенных библиотек CDI или JSF.

Учитывая предоставленную вами информацию, самым простым вариантом здесь будет удаление перечисленных вами библиотек (jsf-*.jar, java*.jar) из вашего приложения и включение функций jsf-2.2 и cdi-1.2.

Если вы намеренно связываете в своем приложении другую реализацию JSF, интеграция CDI не будет работать по умолчанию. Если вам нужно использовать CDI с реализацией JSF, связанной с приложением, вы можете использовать функции jsfContainer-2.2 или jsfContainer-2.3. См. https://www.ibm.com/support/knowledgecenter/en/SS7K4U_liberty/com.ibm.websphere.liberty.autogen.nd.doc/ae/rwlp_feature_jsfContainer-2.2.html

person wtlucy    schedule 08.05.2019
comment
Хорошо, теперь я добавил функции jsfContainer-2.2 и localConnector-1.0, и это сработало — спасибо :) - person ak4784; 08.05.2019