Java @PostConstruct中的CDI参数
我认为我的问题与类似,但没有发现它起作用Java @PostConstruct中的CDI参数,java,jsf-2,ejb-3.0,java-ee-6,Java,Jsf 2,Ejb 3.0,Java Ee 6,我认为我的问题与类似,但没有发现它起作用 <f:metadata> <f:viewParam id="id" name="id" value="#{detailsBean.id}"/> </f:metadata> 我无法记录id 当然,@ManagedProperty与CDI不兼容 *****更新***** 一些xhtml: <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE com
<f:metadata>
<f:viewParam id="id" name="id" value="#{detailsBean.id}"/>
</f:metadata>
我无法记录id
当然,@ManagedProperty与CDI不兼容
*****更新*****
一些xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="../template.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="head">
<f:metadata>
<f:viewParam name="paginator" value="#{contactsBean.contactsTablePaginator}"/>
<f:viewParam name="rows" value="#{contactsBean.contactsTableRows}"/>
</f:metadata>
</ui:define>
<ui:define name="content">
<p:growl id="growl" showDetail="true"/>
<p:panel id="contactsPanel" >
<h:form id ="contactsForm">
<p:dataTable id="contactsTable" value="#{contactsBean.contacts}" selection="#{detailsBean.detailsContact}" var="contacts" widgetVar="contactsTable"
selectionMode="single" rowSelectListener="#{contactsBean.rowSelect}" rowUnselectListener="#{contactsBean.rowUnSelect}"
onRowUnselectUpdate="detailsForm" onRowSelectUpdate="detailsForm"
paginator="#{contactsBean.contactsTablePaginator}" rows="#{contactsBean.contactsTableRows}" rowsPerPageTemplate="5,10,15,25,50,100"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}">
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search:" />
<p:inputText id="globalFilter" onkeyup="contactsTable.filter()" style="width:150px" />
</p:outputPanel>
</f:facet>
<p:column filterStyle="display:none" filterBy="#{contacts.name}" headerText="Name" style="width:200px">
<h:outputText value="#{contacts.name}" />
</p:column>
<p:column filterStyle="display:none" filterBy="#{contacts.street}" headerText="Street" style="width:280px">
<h:outputText value="#{contacts.street}" />
</p:column>
<p:column filterStyle="display:none" filterBy="#{contacts.city}" headerText="City" style="width:150px">
<h:outputText value="#{contacts.city}" />
</p:column>
<p:column filterStyle="display:none" filterBy="#{contacts.state}" headerText="State" style="width:50px">
<h:outputText value="#{contacts.state}" />
</p:column>
<p:column filterStyle="display:none" filterBy="#{contacts.zip}" headerText="Zip" style="width:100px">
<h:outputText value="#{contacts.zip}" />
</p:column>
<p:column filterStyle="display:none" filterBy="#{contacts.country}" headerText="Country" style="width:150px">
<h:outputText value="#{contacts.country}" />
</p:column>
<p:column filterStyle="display:none" filterBy="#{contacts.sent}" headerText="Sent" style="width:50px">
<h:outputText value="#{contacts.sent}" />
</p:column>
</p:dataTable>
<p:ajaxStatus >
<f:facet name="start">
<h:graphicImage value="../resources/images/ajax-loader-bar.gif" />
</f:facet>
<f:facet name="complete">
<h:graphicImage value="../resources/images/ajax-loader-bar-still.gif" />
</f:facet>
<f:facet name="default">
<h:graphicImage value="../resources/images/ajax-loader-bar-still.gif" />
</f:facet>
</p:ajaxStatus>
<br />
<p:commandLink value="View All" action="#{contactsBean.viewAll}" />
<p:commandLink value="Default View" action="#{contactsBean.viewDefault}" />
<p:commandLink value="Advanced Search" action="search?faces-redirect=true" />
<br />
</h:form>
<br />
</p:panel>
<br />
<br />
<h:form id="detailsForm">
<p:panel id="detailsPanel" visible="#{detailsBean.visible}" >
<h:panelGrid id="detailsPanelGrid" cellpadding="2" cellspacing="2" columns="3" >
<h:outputText value="Name :" />
<p:inputText id="name" value="#{detailsBean.detailsContact.name}" style="width:400px" />
<p:message for="name" />
<h:outputText value="Email :" />
<p:inputText id="email" value="#{detailsBean.detailsContact.email}" style="width:400px" validatorMessage="Must be a valid email address. EX: test@test.com" >
<f:validateRegex pattern="[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+"/>
<p:ajax event="blur" update="emailMsg" />
</p:inputText>
<p:message id="emailMsg" for="email" />
<h:outputText value="Street :" />
<p:inputText id="street" value="#{detailsBean.detailsContact.street}" style="width:400px" />
<p:message for="street" />
<h:outputText value="City :" />
<p:inputText id="city" value="#{detailsBean.detailsContact.city}" style="width:400px" />
<p:message for="city" />
<h:outputText value="State :" />
<p:inputText id="state" value="#{detailsBean.detailsContact.state}" style="width:400px" validatorMessage="Length is greater than 2" >
<f:validateLength maximum="2" />
<p:ajax event="blur" update="stateMsg" />
</p:inputText>
<p:message id="stateMsg" for="state" />
<h:outputText value="Country :" />
<p:inputText id="country" value="#{detailsBean.detailsContact.country}" style="width:400px" />
<p:message for="country" />
<h:outputText value="Phone :" />
<p:inputText id="phone" value="#{detailsBean.detailsContact.phone}" style="width:400px"/>
<p:message for="phone" />
<h:outputText value="Guests :" />
<p:inputText id="guests" value="#{detailsBean.detailsContact.guests}" style="width:400px"/>
<p:message for="guests" />
<h:outputText value="Arrival :" />
<p:calendar id="arrival" value="#{detailsBean.detailsContact.arrival}" showOn="button" />
<p:message for="arrival" />
<h:outputText value="Departure :" />
<p:calendar id="departure" value="#{detailsBean.detailsContact.departure}" showOn="button" />
<p:message for="departure" />
<h:outputText value="Message :" />
<p:inputTextarea id="message" effectDuration="30" style="width:400px;height:100px;" value="#{detailsBean.detailsContact.message}" />
<p:message for="message" />
<h:outputText value="Departure :" />
<p:calendar id="inserted" value="#{detailsBean.detailsContact.inserted}" showOn="button"/>
<p:message for="inserted" />
<h:outputText value="Sent :" />
<h:selectBooleanCheckbox id="sent" value="#{detailsBean.detailsContact.sent}" />
<p:message for="sent" />
<br />
</h:panelGrid>
<p:commandButton value="Submit" action="#{detailsBean.updateContactDetails}" update="contactsForm, growl, stateMsg" />
<p:commandButton value="Close" action="#{detailsBean.handleClose}" update="contactsForm, detailsForm" />
</p:panel>
</h:form>
</ui:define>
</ui:composition>
更重要的是:
@Named(value = "contactsBean")
@RequestScoped
public class ContactsBean {
@Inject
EditBean editBean;
@EJB
private ContactsFacade contactsEJB;
private List<Contacts> contacts = new ArrayList<Contacts>();
private boolean contactsTablePaginator = true;
private int contactsTableRows = 10;
private Contacts selectedContact = new Contacts();
public ContactsBean() {
}
@PostConstruct
public void onLoad() {
updateContactsList();
}
public String viewDefault() {
contactsTablePaginator = true;
contactsTableRows = 10;
return "index?faces-redirect=true&includeViewParams=true";
}
public String viewAll() {
contactsTablePaginator = false;
contactsTableRows = 100;
return "index?faces-redirect=true&includeViewParams=true";
}
public void updateContactsList() {
contacts.clear();
contacts = contactsEJB.findAll();
}
public void rowSelect(SelectEvent event) {
editBean.setVisible(true);
editBean.setDetailsContact((Contacts) event.getObject());
}
public void rowUnSelect(UnselectEvent event) {
editBean.setVisible(false);
editBean.setDetailsContact(new Contacts());
}
}
@Named(value=“contactsBean”)
@请求范围
公共类联系人Bean{
@注入
EditBean;
@EJB
私人联系人FACADE contactsEJB;
private List contacts=new ArrayList();
私有布尔contactsTablePaginator=true;
私人int ContactStablerRows=10;
私人联系人selectedContact=新联系人();
公共联系人Bean(){
}
@施工后
public void onLoad(){
updateContactsList();
}
公共字符串viewDefault(){
contactsTablePaginator=true;
ContactStablerRows=10;
返回“index?faces redirect=true&includeViewParams=true”;
}
公共字符串viewAll(){
contactsTablePaginator=false;
ContactStablerRows=100;
返回“index?faces redirect=true&includeViewParams=true”;
}
public void updateContactsList(){
contacts.clear();
contacts=contactsEJB.findAll();
}
公共无效行选择(选择事件事件){
setVisible(true);
setDetailsContact((Contacts)event.getObject());
}
公共无效行取消选择(取消选择事件){
setVisible(false);
setDetailsContact(新联系人());
}
}
输入文本框填充良好。但我一点击submit,它就说值为空。此代码与SessionScope完美配合
警告:/admin/index.xhtml@104109 value=“#{detailsBean.detailsContact.name}”:无法访问目标,“null”返回null
javax.el.PropertyNotFoundException:/admin/index.xhtml@104109 value=“#{detailsBean.detailsContact.name}”:无法访问目标,“null”返回null
我可以看到,当我选择数据表时,它正在调用EditBean。然后,当我单击submit按钮时,它会再次调用它 生命周期不允许您的方法 首先,创建bean(构造函数)。之后,执行依赖项注入,然后是
@PostConstruct
方法,然后评估JSF文件。并且viewParam
在该文件中。因此,您必须注册另一个侦听器,该侦听器在填充视图参数后被调用
我有一个针对@RequestScope
bean的解决方案,但是如果bean的作用域更长(比如视图),那么这个方法将在每个请求(包括AJAX)之后执行,这可能是不需要的
对请求范围bean使用此选项:
<f:metadata>
<f:viewParam id="id" name="id" value="#{detailsBean.id}"/>
<f:event type="preRenderView" listener="#{detailsBean.onLoad}" />
</f:metadata>
我希望这对你有帮助
编辑: 您在这里使用了大量AJAX。此调用必须至少在
ViewScoped
bean中进行。查看范围类似于RequestScope
,但需要相当长的时间才能离开页面
但是我还没有全部阅读,有很多代码,如果ViewScope没有帮助,那么也许您应该提供一小段有问题的代码,以便有机会发现并关注真正的问题。我遇到了与您完全相同的问题,并通过使用外部上下文(包含GET参数)解决了它而不是
f:viewParam
在@PostConstruct
方法中,只需使用以下内容获取参数
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
我相信@PostConstruct只会在bean初始化阶段被调用。因此,您的onLoad()方法可能没有被调用。相关:问题听起来像是有时值为null,有时不是,所以bean可能没有在需要时加载参数。谢谢。看来viewParams更适合SessionScoped bean?这很有趣,因为我的想法正好相反。我试图为每一页呈现一个新bean,而每一页都没有保留任何内容。我认为请求范围是最好的方法。我想不是。当我去更新detailsContact时,它仍然没有解决detailsContact为null的另一个问题。就像一按下提交按钮,就会创建一个新的详细信息联系人。我认为请求比那个长一点。@dham:我认为页面的最佳范围是请求或视图(当您使用AJAX时)。更长的范围是多余的。将事件侦听器与RequestScope一起使用是很好的。你的另一个问题是什么?我找不到解释。如果你能给我们看一些代码并描述它,那就太好了,因为我不懂。嗨,我会用这个问题更新我的帖子。我有一个datatable,然后我选择一行,这将带我到另一个页面。我使用请求范围来使用EJB填充inputText字段。我正在使用您向我展示的侦听器方法。这些字段填充得很好,但是当我提交更改时,我得到一个错误,即字段实际上为空。这很奇怪。即使不转到其他页面进行编辑,我也会遇到同样的问题。是否可以将ViewScope与命名注释一起使用?似乎不适合这样做。我猜我将不得不使用ManagedBean javax.faces注释。@dham我不知道,我总是在属性名中使用ManagedBean
<f:metadata>
<f:viewParam id="id" name="id" value="#{detailsBean.id}"/>
<f:event type="preRenderView" listener="#{detailsBean.onLoad}" />
</f:metadata>
#{detailsBean.onLoad()}
<f:metadata>
<f:viewParam id="id" name="id" value="#{detailsBean.id}"/>
</f:metadata>
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();