已加载的记录未显示在视图中

时间:2014-05-26 11:19:34

标签: java jsf primefaces jboss7.x conversation-scope

所以为了使它相对简单:我有一些Primefaces-Page,它应该代表表结构中的数据库记录。

我将这些记录保存在List<Customer>中,该@ConversationScoped位于emptyMessage支持bean中。我已通过调试验证,List 正确填充了数据库中的记录(hibernate db FWIW)。这是在“businessInterface”Distributor类的帮助下完成的,实际上只是(Database)Service-Classes的解耦掩码。

如上所述,我已经验证数据库以及分发服务器正确返回了预期值。不幸的是,在视图中有没有记录,而是显示h:head

应用程序在jBoss 7.1.1-Final Application Server上运行。

为了更好的可读性,我在所提供的代码周围排除了h:bodyui:compositionui:defineh:form<ui:define name="inhalt"> <p:growl id="msgGrowl" autoUpdate="true" showDetail="true" /> <h:form onkeypress="if (event.keyCode == 13) {return false; }"> <p:dataTable var="customeritem" id="customerTable" rowkey="#{customeritem.id}" value="#{customerListController.customerList}" paginator="true" rows="13" autoUpdate="true" filteredValue="#{customerListController.filteredCustomers}" emptyMessage="no customers found!" sortFunction="#{customerListController.filteredCustomers}"> <p:column sortBy="name" filterBy="name" headerText="Kunde" filterMatchMode="contains"> <h:outputText value="#{customeritem.name}" /> </p:column> <p:column> <f:facet name="header"> <p:commandButton value="Neuer Kunde" action="${customerListController.addCustomer()}" icon="ui-icon-plus" /> </f:facet> <p:commandButton id="doViewDetailsButton" icon="ui-icon-clipboard" action="${customerListController.viewDetails(customeritem.getId())}" /> <p:tooltip for="doViewDetailsButton" value="Details ansehen" /> </p:column> </p:dataTable> </h:form> </ui:define> 以及将列缩短为两种不同的用法(属性显示和动作说明)

视图(缩短和截断):

@Named
@ConversationScoped
public class CustomerListController implements Serializable {

    private static final long serialVersionUID = -5961625401284927892L;

    private List<Customer> customerList = new ArrayList<Customer>();
    private List<Customer> filteredCustomers = new ArrayList<Customer>();

    @Inject
    CustomerEditController customerEditController;

    @Inject
    CustomerDetailsController customerDetailsController;

    @Inject
    CustomerDistributor businessInterface;

    public String addCustomer() {
        return editCustomer(0l);
    }

    public String editCustomer(long customerId) {
        setFilteredCustomers(null);
        customerEditController.recieveCustomerById(customerId);
        return Pages.CUSTOMER_EDIT;
    }

    public String viewDetails(long customerId) {
        setFilteredCustomers(null);
        customerDetailsController.recieveCustomerById(customerId);
        return Pages.CUSTOMER_DETAILS;
    }

    public String deleteCustomer(long customerIdToDelete) {
        businessInterface.delete(customerIdToDelete);
        setFilteredCustomers(null);
        fillCustomerList();
        return Pages.CUSTOMER_LIST;
    }

    @PostConstruct
    public void fillCustomerList() {
        customerList.clear();
        customerList.addAll(businessInterface.loadAll());

    }

    public List<Customer> getCustomerList() {
        return customerList;
    }

    public List<Customer> getFilteredCustomers() {
        return filteredCustomers;
    }

    public void setFilteredCustomers(List<Customer> filteredCustomers) {
        this.filteredCustomers = filteredCustomers;
    }
}

支持Bean:

@SessionScoped

这个曾经工作,当我在@ConversationScoped中使用Backing Bean时,但由于需要通过hackish变通方法来产生直观(和预期)行为,我决定将Backing Bean移动到范围较小。因此,我选择了CustomerEditController,因为BackingBean需要保持比请求生命周期更长的时间...(同时针对每个请求针对数据库运行查询都非常昂贵......)

关于CustomerDetailsController@PostConstruct public void fillCustomerList()的简短说明。如果通过单击其中一个按钮请求单个记录,则它们是编辑和显示有关单个记录的更多信息的负责人。

非工作内容是{{1}}。 其他一切按预期工作 ......

如果您需要任何进一步的信息,请询问,我将根据需要提供背景信息;)

1 个答案:

答案 0 :(得分:0)

我已经找到了一个成功的解决方法,但它非常强烈,我真的不喜欢这种方法,因为它在getter中引入了额外的行为。我按如下方式修改了Backing Bean:

public List<Customer> getCustomerList() {
    if (customerList.size() == 0) {
        fillCustomerList();
    }
    return customerList;
}

但让我再说一遍,

这绝对不是理想的行为,也不是解决这个问题的好方法。

编辑:

经过多次挖掘和幸运链接后,我发现了一个不同的修复方法。我按如下方式修改了支持bean:

@Inject
Conversation conversation;

@PostConstruct
public void init() {
    if(conversation.isTransient()) {
        conversation.end();
    }
    conversation.setTimeout(120000);
    conversation.start();
}

现在即使没有吸气剂中的hackish行为也能正常工作(如上所示)。