@PostConstruct中的CDI参数

我认为我的问题与此类似,但尚未发现它有效

   

为什么我不能用@Named执行此操作并使用CDI:

 @Named @RequestScoped public class DetailsBean { private Contacts detailsContact; @EJB ContactsFacade contactsEJB; private int id; public DetailsBean() { System.out.println("details bean called"); } @PostConstruct public void onLoad() { detailsContact = contactsEJB.find(id); } 

我无法记录身份证。

当然,@ ManagedProperty与CDI不兼容。

***** UPDATE *****

一些xhtml:

           


 

 






更多java代码:

 package com.atlanticpkg.view.beans; import com.atlanticpkg.model.entities.Contacts; import com.atlanticpkg.util.FacesUtils; import java.io.Serializable; import javax.annotation.PostConstruct; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; import javax.inject.Named; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.inject.Inject; @Named(value = "detailsBean") @RequestScoped public class EditBean { private Contacts detailsContact; private boolean visible = false; @Inject ContactsBean contactsBean; public EditBean() { } @PostConstruct public void onLoad() { } public void handleClose() { this.setVisible(false); this.setDetailsContact(new Contacts()); } public void updateContactDetails() { try { contactsBean.getContactsEJB().edit(detailsContact); FacesUtils.addMessage(detailsContact.getName() + " was updated successfully!"); } catch (Exception e) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERROR", e.toString())); } } } 

甚至更多:

 @Named(value = "contactsBean") @RequestScoped public class ContactsBean { @Inject EditBean editBean; @EJB private ContactsFacade contactsEJB; private List contacts = new ArrayList(); 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()); } } 

inputText框填充得很好。 但是当我点击提交时,它表示值为空。 此代码与SessionScope完美配合。

警告:/admin/index.xhtml @ 104,109 value =“#{detailsBean.detailsContact.name}”:目标无法访问,’null’返回null javax.el.PropertyNotFoundException:/admin/index.xhtml @ 104,109 value =“#{ detailsBean.detailsContact.name}“:目标无法访问,’null’返回null

我可以看到,当我选择数据表时,它正在调用EditBean。 然后单击提交按钮时再次调用它。

生命周期不允许您的方法。

首先,创建bean(构造函数)。 之后,执行dependency injection,然后是@PostConstruct方法,然后评估JSF文件。 viewParam在该文件中。 因此,您必须注册另一个在填充视图参数后调用的侦听器。

我有一个@RequestScope bean的解决方案,但如果bean的范围更长(如View),则在每个请求(包括AJAX)之后执行此方法,这可能是不可取的。

将此用于请求范围bean:

     

对于@ViewScope bean,我使用的是“hack”,但它可能不是最佳实践。 它做同样的事情,但可能它不是正确的方法。

 #{detailsBean.onLoad()}    

我希望这对你有所帮助。


编辑:

你在这里使用了很多AJAX。 这些调用必须至少ViewScoped bean。 View Scope与RequestScope类似,但需要相当长的时间 – 直到页面被留下。

但是我还没有读完所有内容,有很多代码,如果ViewScope没有帮助,那么也许你应该提供一小段有问题的代码,以便有机会找到并专注于真正的问题。

我遇到了与你完全相同的问题,并通过使用外部上下文(包含GET参数)而不是f:viewParam来解决它。

@PostConstruct方法中,只需使用类似的方法获取参数

 FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();