JSF:PropertyNotFoundException类''没有属性''

时间:2013-12-27 10:06:41

标签: java jsf el

两天我正在寻找解决这个基本问题的方法。是的我确实有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>

4 个答案:

答案 0 :(得分:3)

我检查了你的代码并且存在一些问题,但我不确定是哪一个引起了你的问题,因为我注释了数据库的内容以使其快速运行。

我想主要的问题是你尝试将CDI和JSF托管bean一起使用,这些bean不应该没有问题。

  1. 您使用的是javax.faces.bean.SessionScopedjavax.faces.bean.ManagedBean,而是应该使用javax.enterprise.context.SessionScopedjavax.annotation.ManagedBean甚至javax.inject.Named代替ManagedBean 。请查看this question以获取有关差异的详细信息。

  2. 您创建的文件manage-beans.xml的内容通常属于faces-config.xml,但无论如何都是过时的,因为XML中的声明是通过注释声明的替代方法。你不需要两者。您可以删除manage-beans.xml中的web.xml和参考。如果你想使用这样的XML声明,你可以将它们放在faces-config.xml

  3. 您的web.xml包含facelets.SKIP_COMMENTS,应替换为javax.faces.FACELETS_SKIP_COMMENTS

  4. 您的项目缺少beans.xml。你在评论中写道,你已经创建了一个,无论如何这里是一个参考它应该是什么样的:

  5. 示例:

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

在我的情况下,我刚刚更改了变量的名称,目标文件夹没有反映更改。因此,当我编译和重新部署时,它为我工作。