为什么JSF会使成功在支持bean中实例化的嵌套类无效? [英] Why does JSF null out a nested class successfully instantiated in the backing bean?

查看:55
本文介绍了为什么JSF会使成功在支持bean中实例化的嵌套类无效?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为了清楚(简洁),我仅列出代码的关键段.

For the sake of clarity (and brevity) I am listing just the key segments of my code.

我有一个包含两个嵌套类的后备bean MemberView:

I have a backing bean MemberView containing two nested classes:

private Person person;
private Member member;

在页面加载时实例化的

:

that are instantiated when the page loads:

@PostConstruct
public void init() {
    person = new Person();
    member = new Member();
}

带有适当的吸气剂和吸气剂.我有一个网页member.xhtml,该网页利用PrimeFaces并显示嵌套的类属性:

with the appropriate getters and setters. I have a web page, member.xhtml, that utilizes PrimeFaces and displays nested class properties:

<p:inputText value="#{memberView.person.lastName}" />
<p:inputText value="#{memberView.member.id}" />

和一个命令按钮,该命令按钮在后备bean中调用搜索例程:

and a CommandButton that calls a search routine in the backing bean:

<p:commandButton value="Retrieve" type="submit" 
                      actionListener="#{memberView.fetchMembers()}" 
                      update="@all"/>

页面加载无任何意外.但是选择CommandButton会导致EL ContextAwarePropertyNotFoundException:javax.el.PropertyNotFoundException:Target Unreachable,'member'返回null.

The page loads without incident. But selecting the CommandButton results in an EL ContextAwarePropertyNotFoundException: javax.el.PropertyNotFoundException: Target Unreachable, 'member' returned null.

为跟踪正在发生的事情,我在get-和setMember方法中添加了一些日志记录:

To track what is happening, I added some logging to the get- and setMember methods:

public Member getMember() {
    LOG.info("getMember() invoked");
    if(member == null) {
        LOG.log(Level.WARNING, "getMember() returning NULL");
    }
    LOG.info("getMember() returning Member: " + member.toString()
            + " with ID: " + member.getId());
    return member;
}

public void setMember(Member member) {
    LOG.info("setMember() invoked with argument: " + member);
    this.member = member;
}

这是我单击 CommandButton 时的输出:

INFO: getMember() invoked
INFO: getMember() returning Member: scc.model.Member@6f453701 with ID: null
INFO: getMember() invoked
INFO: getMember() returning Member: scc.model.Member@6f453701 with ID: null
INFO: getMember() invoked
INFO: getMember() returning Member: scc.model.Member@6f453701 with ID: null
INFO: setMember() invoked with argument: null
INFO: getMember() invoked
WARNING: getMember() returning NULL

很显然,类Member已被清空.进一步的细节.如果我注释掉会员ID输入字段

Clearly, the class Member is being nulled out. One further detail. If I comment out the member ID input field

<!-- <p:inputText value="#{memberView.member.id}" /> -->

,然后选择检索"按钮,页面将用嵌套的MemberView Person类提供的成员名称和名称字段填充dataTable:

and then select the Retrieve button, the page populates a dataTable with the names of members and the name field, as supplied by the nested MemberView Person class:

<p:dataTable id="dtPerson" var="member"
            style="margin-top:10px;text-align:center;width:400px;minWidth:400px"
                     value="#{memberView.selectableMemberList}"
                     selectionMode="single" editable="false"
                     selection="#{memberView.member}" >

<p:inputText value="#{memberView.person.lastName}" />

在三遍成功返回实例化类的调用之后,我完全不愿意使用空参数来解释对setMember方法的EL调用.我愿意接受所有建议.

I am at a complete loss to explain the EL call to the setMember method with a null argument after three calls that successfully returned the instantiated class. I am open to any and all suggestions.

推荐答案

感谢您的及时有益的答复.遵循BalusC的建议,跟踪显示在DataTable.processUpdates期间Method类为空.由于没有行数据,因此在表中找不到成员,因此PrimeFaces SelectableDataModel返回null,然后由JSF方法BeanELResolver.setValue设置该值.

Thanks to you both for your timely and helpful responses. Following BalusC's suggestion, a trace shows that the Method class is nulled during DataTable.processUpdates. Since there is no row data, and therefore no Member to be found in the table, the PrimeFaces SelectableDataModel returns null, which is then set by the JSF method BeanELResolver.setValue.

我以前的数据库都利用多对一的关系,其中ArrayLists在构造后填充,而从设计上讲,此后永远不会为空.一种可能的解决方法是,如页面在BalsC于2006年所建议的那样,在页面加载时填充数据表(您可以在[backing] bean的构造函数或初始化块中加载dataList.")="http://balusc.omnifaces.org/2006/06/using-datatables.html" rel ="nofollow noreferrer"> http://balusc.omnifaces.org/2006/06/using-datatables.html

My prior databases all utilize many-to-one relationships where ArrayLists are populated on post-construct and, by design, are never empty thereafter. One possible resolution here would be to populate the data table when the page loads, as suggested in this 2006 post by BalusC ("You can load the dataList in either the constructor or initialization block of the [backing] bean.") http://balusc.omnifaces.org/2006/06/using-datatables.html

更通用的解决方案是在初始化时以及每当查询返回空结果集时,为数据表提供一个空白而不是空的数据列表:

A more general solution is to provide the data table with a blank, not empty, data list, both on initialization and whenever a query returns an empty result set:

/**
* Member edited/displayed in web page text fields 
*/
private Member member;

/**
 * List of Member Objects
 */ 
private List<Member> mList;

/**
 *  Member List implementing PF SelectableDataModel
 */
private SelectableMemberList selectableMemberList;

/**
 * Creates a blank [not empty] SelectableMemberList.
 * Call on PostConstruct & on return of empty result set.
 */
private void blankSelectableMemberList() {
    if(mList == null) {         // instantiate on init()
        mList = new ArrayList<>();
    }
    if(mList.isEmpty()) {       // add blank Object
        mList.add(new Member());
    }
selectableMemberList = new SelectableMemberList(mList);
}

我希望这对想要显示空"数据表的人有所帮助.

I hope this is helpful to anyone who wants to display an "empty" data table.

这篇关于为什么JSF会使成功在支持bean中实例化的嵌套类无效?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆