具有自由服务器的JSF CDI示例不起作用

时间:2019-05-08 13:42:37

标签: java jsf websphere cdi

我已经用JSF + CDI + Liberty Server构建了一个简单的示例,但是我总是得到这样的消息:我的bean目标不可用,我也不明白为什么。

我已经实现了以下库:

  • javaee-api-7.0.jar
  • javax.servlet-api-3.1.0.jar
  • jsf-api-2.2.12.jar
  • jsf-impl-2.2.2.jar

我将Java 1.8与WebShere Application Server 18.0.0.2。一起使用。

如果我运行该应用程序,则可以看到输入字段,但是当我输入内容并单击“发送”按钮时,总是会出现以下错误:

SRVE0777E:应用程序类“ javax.faces.webapp.FacesServlet.service:659”引发异常。 javax.servlet.ServletException:/pages/index.xhtml @ 12,72 value =“#{userBean.firstName}”:目标无法访问,标识符'userBean'解析为null

版本是否有问题?

UserBean.java

Percent

index.xhtml

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

@Named
@RequestScoped
public class UserBean {

    private String firstName;
    private String lastName;

    //Getter and Setter

}

result.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>

beans.xml

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

web.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>

faces-config.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>

1 个答案:

答案 0 :(得分:1)

WebSphere Liberty提供了自己的JSF功能-jsf-2.0jsf-2.2jsf-2.3-允许应用程序使用相应的MyFaces实现。这些功能与服务器提供的CDI功能集成在一起,因此,将jsf-2.2cdi-1.2一起启用将允许这种类型的应用程序运行,而无需任何其他附带的CDI或JSF库。

鉴于您提供的信息,此处最直接的选择是从应用程序中删除已列出的库(jsf-*.jarjava*.jar)并启用{{1 }}和jsf-2.2功能。

如果您有意在应用程序中捆绑其他JSF实现,则CDI集成将无法立即使用。如果需要将CDI与应用程序捆绑的JSF实现一起使用,则可以使用cdi-1.2jsfContainer-2.2功能。参见https://www.ibm.com/support/knowledgecenter/en/SS7K4U_liberty/com.ibm.websphere.liberty.autogen.nd.doc/ae/rwlp_feature_jsfContainer-2.2.html