两天我正在寻找解决这个基本问题的方法。是的我确实有GETTER AND SETTER,而且我确实认为惯例是正常的。
以下是代码:
Bean:
@Named
@SessionScoped
public class ClientController implements Serializable {
@Inject
private ClientService das;
private List<Client> clientsList;
public void setClientsList(List<Client> clientsList) {
this.clientsList = clientsList;
}
private Client client = new Client();
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
public void createclient(ActionEvent actionEvent) {
das.create(client);
}
public List<Client> getClientsList() {
clientsList = das.findByNativeQuery(Client.ALL);
return clientsList;
}
}
Page index.xhtml:
<ui:composition template="/templates/layout.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:define name="content">
<h:form>
<p:panel header="Créer un Client">
<h:outputText value="Prénom : "></h:outputText>
<p:inputText id="clientName" value="#{clientController.client.name}" required="true"
requiredMessage="Entrez votre prénom" message="fc">
<f:validateLength minimum="2" />
</p:inputText>
<h:outputText value="Nom : "></h:outputText>
<p:inputText id="clientLastName" value="#{clientController.client.lastName}"
required="true" requiredMessage="Entrez votre nom" message="fc">
<f:validateLength minimum="2" />
</p:inputText>
</p:panel>
<p:commandButton value="Submit"
actionListener="#{clientController.createclient}" />
</h:form>
</ui:define>
</ui:composition>
错误:
/index.xhtml @14,57 value="#{clientController.client.name}": The class 'controllers.ClientController' does not have the property 'client'.
正如您所看到的,Bean已经解析,甚至解析了createclient()方法(我尝试在没有其余代码的情况下测试它)。问题只是属性......
请帮帮忙?我确定这是一个愚蠢的问题,但有时我们只需要另一种观点
修改
WEB-INF / 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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Bourse</display-name>
<!-- Current project stage. When it is set to 'Development' Primefaces give
a lot of debug information on the screen. -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>facelets.SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<welcome-file-list>
<welcome-file>/index.xhtml</welcome-file>
</welcome-file-list>
<!-- Staring JSF -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- JSF URL mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/manage-beans.xml</param-value>
</context-param>
</web-app>
WEB-INF / manage-beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<managed-bean>
<managed-bean-name>clientController</managed-bean-name>
<managed-bean-class>controllers.ClientController</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
答案 0 :(得分:3)
我检查了你的代码并且存在一些问题,但我不确定是哪一个引起了你的问题,因为我注释了数据库的内容以使其快速运行。
我想主要的问题是你尝试将CDI和JSF托管bean一起使用,这些bean不应该没有问题。
您使用的是javax.faces.bean.SessionScoped
和javax.faces.bean.ManagedBean
,而是应该使用javax.enterprise.context.SessionScoped
和javax.annotation.ManagedBean
甚至javax.inject.Named
代替ManagedBean
。请查看this question以获取有关差异的详细信息。
您创建的文件manage-beans.xml
的内容通常属于faces-config.xml
,但无论如何都是过时的,因为XML中的声明是通过注释声明的替代方法。你不需要两者。您可以删除manage-beans.xml
中的web.xml
和参考。如果你想使用这样的XML声明,你可以将它们放在faces-config.xml
。
您的web.xml包含facelets.SKIP_COMMENTS
,应替换为javax.faces.FACELETS_SKIP_COMMENTS
。
您的项目缺少beans.xml
。你在评论中写道,你已经创建了一个,无论如何这里是一个参考它应该是什么样的:
示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans 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/beans_1_0.xsd">
</beans>
另见:
答案 1 :(得分:0)
要在JSF2.0中启用CDI,您需要使用beans.xml或faces-config.xml来定义托管bean。建议使用单独的文件来配置bean,因为faces-config.xml将具有特定于应用程序的配置。请阅读此link以更多地了解CDI的工作原理。请注意,CDI基于JAVA EE版本工作。
更新
您需要检查是否在xhtml页面的任何位置正确命名bean,并确保正确加载了类和配置文件
答案 2 :(得分:0)
除了所有其他问题,这些家伙在之前的答案中说你必须检查,你只是有一个EL问题:
value="# {clientController.client.lastName}"
^here this is not valid for EL
在你关注所有其他建议后,改变这一点,你的例外应该消失。
答案 3 :(得分:0)
在我的情况下,我刚刚更改了变量的名称,目标文件夹没有反映更改。因此,当我编译和重新部署时,它为我工作。