java – 在@ViewScoped bean中获取GET请求参数
我有一个(请求范围的)列表,用户可以从中选择“PQ”(链接列表).单击或以其他方式输入浏览器时,应显示每个PQ的主页面.每个PQ的页面都是表格
HTTP://本地主机:8080 /项目名称/ main.jsf ID = 2 这是PQ bean的第一个: @Named @ViewScoped public class PqHome implements Serializable { @PersistenceContext(unitName="...") private EntityManager em; private Integer id; private PQ instance; @PostConstruct public void init() { System.out.println("ID is " + id); // ID from URL param instance = em.find(PQ.class,id); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public PQ getInstance() { return instance; } } 这是main.xhtml: <ui:composition xmlns="http://www.w3.org/1999/xhtml" ...> <ui:define name="metadata"> <f:metadata> <f:viewParam name="id" value="#{pqHome.id}"> <f:convertNumber integerOnly="#{true}" /> </f:viewParam> <!--f:event type="preRenderView" listener="#{pqHome.init}" /--> </f:metadata> </ui:define> <ui:define name="title"> <h:outputText value="Main" /> </ui:define> ... </ui:composition> 每当我选择或以其他方式刷新页面/ URL时,我都会从EntityManager获得NullPointerException: org.jboss.weld.exceptions.WeldException: WELD-000049 Unable to invoke [method] @PostConstruct public de.mycomp.myproj.beans.PqHome.init() on de.mycomp.myproj.beans.PqHome@4f0ea68f at org.jboss.weld.bean.AbstractClassBean.defaultPostConstruct(AbstractClassBean.java:595) ... Caused by: java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:87) at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:59) at org.hibernate.internal.SessionImpl.get(SessionImpl.java:961) at org.hibernate.internal.SessionImpl.get(SessionImpl.java:957) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:787) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:762) at org.jboss.as.jpa.container.AbstractEntityManager.find(AbstractEntityManager.java:221) at de.mycomp.myproj.beans.PqHome.init(PqHome.java:47) ... 56 more [第47行是em.find(…)] 这条线 <f:event type="preRenderView" listener="#{pqHome.init}" /> 不会让事情变得更好.我现在很沮丧. 如何将URL GET请求参数传入@ViewScoped bean? 注意:我敢打赌这不是一件小事.有可能我在概念上做错了,所以欢迎任何有关如何改进的提示.我觉得我需要选择@ViewScoped,因为在该页面上会有更复杂的基于AJAX的GUI,我真的希望通过URL GET参数来访问它. 谢谢 解决方法
在构造bean和所有依赖注入之后直接调用@PostConstruct(例如@PersistenceContext,@ EJB,@ ManagedProperty,@ Inject等等.).
< f:viewParam>在更新模型值阶段设置其值,该阶段是bean的远期(后)构造.所以在@PostConstruct里面< f:viewParam>价值尚未设定.那时它仍然是空的. 您接近< f:event type =“preRenderView”>,但您必须删除@PostConstruct注释. 所以: <f:viewParam name="pq" value="#{pqHome.id}"> <f:convertNumber integerOnly="#{true}" /> </f:viewParam> <f:event type="preRenderView" listener="#{pqHome.init}" /> 同 private Integer id; public void init() { instance = em.find(PQ.class,id); } 与具体问题无关,我建议使用转换器代替.另见Communication in JSF 2.0 – Converting and validating GET request parameters. @Named @ViewScoped组合也不会按预期工作.特定于JSF的@ViewScoped仅与JSF特定的@ManagedBean结合使用.您的CDI特定@Named将以这种方式表现为@RequestScoped.使用@ManagedBean而不是@Named或使用CDI特定的@ConversationScoped而不是@ViewScoped. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |