自由服务器的 JSF CDI 示例不起作用
JSF CDI example with liberty server does not work
我已经使用 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: 应用程序抛出异常 class 'javax.faces.webapp.FacesServlet.service:659'
javax.servlet.ServletException: /pages/index.xhtml @12,72 value="#{userBean.firstName}": 目标无法到达,标识符 'userBean' 解析为 null
会不会是版本有问题?
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>
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>
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>
web.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>
WebSphere Liberty 提供了自己的 JSF 功能 - jsf-2.0
、jsf-2.2
和 jsf-2.3
- 允许应用程序使用相应的 MyFaces 实现。这些功能与 server-provided CDI 功能集成,因此启用 jsf-2.2
和 cdi-1.2
将允许此类应用程序在没有任何额外的 CDI 或 JSF 库的情况下工作。
根据您提供的信息,您最直接的选择是从您的应用程序中删除您列出的库(jsf-*.jar
、java*.jar
)并启用 jsf-2.2
和 cdi-1.2
特征。
如果您有意在应用程序中捆绑不同的 JSF 实现,CDI 集成将不起作用 out-of-the-box。如果您需要将 CDI 与 application-bundled 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
我已经使用 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: 应用程序抛出异常 class 'javax.faces.webapp.FacesServlet.service:659' javax.servlet.ServletException: /pages/index.xhtml @12,72 value="#{userBean.firstName}": 目标无法到达,标识符 'userBean' 解析为 null
会不会是版本有问题?
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>
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>
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>
web.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>
WebSphere Liberty 提供了自己的 JSF 功能 - jsf-2.0
、jsf-2.2
和 jsf-2.3
- 允许应用程序使用相应的 MyFaces 实现。这些功能与 server-provided CDI 功能集成,因此启用 jsf-2.2
和 cdi-1.2
将允许此类应用程序在没有任何额外的 CDI 或 JSF 库的情况下工作。
根据您提供的信息,您最直接的选择是从您的应用程序中删除您列出的库(jsf-*.jar
、java*.jar
)并启用 jsf-2.2
和 cdi-1.2
特征。
如果您有意在应用程序中捆绑不同的 JSF 实现,CDI 集成将不起作用 out-of-the-box。如果您需要将 CDI 与 application-bundled 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