Jsf setPropertyActionListener不设置任何内容

Jsf setPropertyActionListener不设置任何内容,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在使用JSF技术。我有两个视图和两个bean。first View homepage.xhtml在第一个Bean UserBean中设置一个文本参数,如下所示: @ManagedBean @SessionScoped public class UserBean implements Serializable{ private String searchText; public UserBean(){} public String search() { return "

我正在使用JSF技术。我有两个视图和两个bean。first View homepage.xhtml在第一个Bean UserBean中设置一个文本参数,如下所示:

@ManagedBean   
@SessionScoped  
public class UserBean implements Serializable{

private String searchText;

public UserBean(){}

public String search() {
    return "searching?faces-redirect=true&text="+searchText;
}
视图中的commandButton提交搜索,并调用UserBean.search。 我在search.xhtml中有这个视图,它是PrimeFaces的一个简单数据列表组件,显示用户列表:

<f:metadata>
    <f:viewParam name="text" value="#{searchView.searchText}"/>
    <f:event type="preRenderView" listener="#{searchView.init()}"></f:event>
</f:metadata>

<h:head>
    <title>Search Results</title>
</h:head>

<h:body>        
    <h:form id="resultsForm">
        <p:dataList var="user" value="#{searchView.results}" type="unordered" itemType="none" paginator="true" rows="10" styleClass="paginated">
            <f:facet name="header">
                Results for #{searchView.searchText}:
            </f:facet>

            <p:panel>
                <p:commandLink update=":resultsForm:userDetail" oncomplete="PF('userDialog').show()" title="user dettagli" styleClass="ui-icon ui-icon-search" style="float:right;margin-right:50px">
                    <f:setPropertyActionListener value = "#{user}" target="#{searchView.selectedUser}"/>
                    <h:outputText value="#{user.firstName}, #{user.lastName}" />
                </p:commandLink>
                <h:outputText value="#{user.firstName} #{user.lastName} (#{user.email})" style="display:inline-block" />
            </p:panel>
        </p:dataList>


    <p:dialog header="User Info" widgetVar="userDialog" modal="true" showEffect="blind" hideEffect="explode" resizable="false">
            <p:outputPanel id="userDetail" style="text-align:center;">
                <p:panelGrid  columns="2" rendered="#{not empty searchView.selectedUser}" columnClasses="label,value">
                    <h:outputText value="First name:" />
                    <h:outputText value="#{searchView.selectedUser.firstName}" />

                    <h:outputText value="Last Name" />
                    <h:outputText value="#{searchView.selectedUser.lastName}" />  

                    <h:outputText value="Calendar" />
                    <h:outputText value="#{searchView.selectedUser.visibility}" />

                </p:panelGrid>
            </p:outputPanel>
        </p:dialog>
    </h:form>
    <br/>
</h:body>
最后,我有一个支持bean:

@ManagedBean
@ViewScoped
public class SearchView implements Serializable {

private List<User> results;
private User selectedUser;
private String searchText;
@EJB
private SearchingManager sm;

public void init() {
    System.out.println("print search text:" + searchText);
    results = sm.search(searchText);
}

public SearchView() {
}

public void setSelectedUser(User selectedUser) {
    System.out.println("setter of selected user");
    this.selectedUser = selectedUser;
}

public User getSelectedUser() {
    System.out.println("getter of selected user");
    return selectedUser;
}
它可以正常工作并正确显示搜索结果,但当它打开结果页面时,我注意到以下输出: Informazioni:打印搜索文本:Mario Informazioni:所选用户的获取者 所以我想知道为什么不选择任何用户就调用getSelectedUser。此外,当我选择一个用户时,它会显示一个空对话框,结果如下: Informazioni:所选用户的获取者 Informazioni:所选用户的获取者 Informazioni:所选用户的获取者 Informazioni:打印搜索文本:Mario Informazioni:所选用户的获取者 所以它回忆起init函数为什么? 最糟糕的是,如果我们关闭对话框并重新打开它,结果是类似的,但是 Informazioni:打印搜索文本:空 它会因为NullPointerException而停止。
我花了几天的时间搜索这个setPropertyActionListener,但我无法理解系统的这种行为

将的进程属性设置为@this like,默认为@form。如果您使用的是JSF 2.2,那么请更改为并删除init方法后不必要悬挂的括号,例如。非常感谢您的评论,我删除了,并将其替换为,不再需要每次调用init以及NullPointerException问题。但是对话框仍然是空的,我看到一个Informazioni:getter of selected user,当页面在commandlink中也使用该属性打开时,你的意思是setter方法public void setselecteduser selectedUser{…}从未被调用吗?当然,从本质上来说,获得者是。只是不要将关键业务逻辑放在getter方法中,也不要担心它们。是的,事实是getSelectedUser是在页面打开时调用的,没有我选择任何用户,而且setter从未调用过。现在我们试着让烘焙豆@SessionScope而不是@ViewScope,并调用目标selectedUser而不是searchView.selectedUser,这一切似乎都正常工作,但我仍然不明白为什么。我还没有提到任何关于它的事-只是把它放在一边,但为什么会出现以下错误?它应该会给你一个解析错误。