Java @非请求作用域Bean中的ManagedProperty(value=";{param.id}";)

Java @非请求作用域Bean中的ManagedProperty(value=";{param.id}";),java,jsf,jsf-2,managed,javabeans,Java,Jsf,Jsf 2,Managed,Javabeans,我需要将参数(POST)传递给@managedBean,我使用了如下托管属性: @ManagedProperty(value = "#{param.id}") private int id; Bean的作用域是ViewScope 我最终会出现以下错误: 无法创建托管bean收据。发现以下问题:-表达式#{param.id}request引用的对象的范围比引用的托管bean视图范围短 我能做什么 arjan看一看: 我的页面: Facelet标题 有两种方式: 使bean请求具有作用域,

我需要将参数(POST)传递给@managedBean,我使用了如下托管属性:

@ManagedProperty(value = "#{param.id}")
private int id;
Bean的作用域是ViewScope

我最终会出现以下错误:

无法创建托管bean收据。发现以下问题:-表达式#{param.id}request引用的对象的范围比引用的托管bean视图范围短

我能做什么

arjan看一看:

我的页面: Facelet标题


有两种方式:

  • 使bean请求具有作用域,并将视图作为另一个注入作用域
    @ManagedProperty

    @ManagedBean
    @RequestScoped
    public class RequestBean {
    
        @ManagedProperty(value="#{param.id}")
        private Integer id;
    
        @ManagedProperty(value="#{viewBean}")
        private ViewBean viewBean;
    }
    
    视图范围bean在
    @PostConstruct
    和请求范围bean的操作方法期间可用。您只需记住,在没有参数的情况下回发到同一视图时,
    id
    可能会丢失

  • 或者,在bean初始化期间从请求参数映射中手动获取它

    @ManagedBean
    @ViewScoped
    public class ViewBean {
    
        private Integer id;
    
        @PostConstruct
        public void init() {
            id = Integer.valueOf(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"));       
        }
    }
    
    这样,初始
    id
    在整个视图范围内都可用


  • 作为直接从bean中的请求获取参数的替代方法,您可以使用
    查看参数

    需要在使用托管bean的Facelet上声明这些内容,如下所示:

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
    >
        <h:body>
    
        <f:metadata>
            <f:viewParam id="id" name="id" value="#{myBean.id}" />        
        </f:metadata>
    
        <!-- Rest of Facelet here -->   
    
        </h:body>
    </html>
    
    以及以下Facelet:

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
    >
        <h:body>
    
            <f:metadata>
                <f:viewParam id="id" name="id" value="#{myBean.id}" />        
            </f:metadata>
    
            <h:outputText value="#{myBean.id}"/>
    
            <h:form>
                <h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
            </h:form>
    
            <form method="post">
                <input name="id" value="4" />
                <input type="submit" value="submit" />
            </form>
    
        </h:body>
    </html>
    
    
    

    在输入字段中输入一个数字,然后单击提交按钮。如果号码打印回屏幕,则测试成功。请注意,第二个表单是一个常规表单,没有发布任何JSF状态。我在JBossAS6上测试了它,它可以正常工作。证明id参数作为GET参数也有效。

    谢谢,第一个解决方案(将ViewScope bean注入RequestScope bean)是一个好的和流行的实践吗???我的应用程序由GlassFish提供,我也可以使用CDI bean,但我决定使用JSF bean做一些项目,因为我对JSF非常陌生,这是个好主意吗?取决于
    id
    的用途。您想在每次请求时“刷新”它吗?走第一条路。还是要在整个视图范围内使用初始值?走第二条路。谢谢,非常完整的描述。@Tarik:我总是从代码片段中省略显而易见的内容,以使答案更集中。考虑到问题的表述方式,OP非常清楚需要getter/setter。如果OP不知道,我宁愿添加一条注释,比如
    /+getter+setter
    ,而不是添加一大堆显而易见的注释。只要让你的IDE自动生成getter/setter并将它们隐藏在类的最底层。据我在书籍和教程中发现的,它们只适用于Get参数,你确定它们可以用于Post参数吗???…嗯,虽然我不是这方面的权威人士,但我很确定我以前在POST参数中使用过。我会再次检查并更新我的答案。我再次测试并更新了我的答案。这只是两个文件,所以应该很容易复制。我还查看了Mojarra源代码,以了解这些参数最终是如何解析的。在Mojarra 2.03中,它位于UIViewParameter第217行:String paramValue=context.getExternalContext().getRequestParameterMap().get(getName());由于请求参数映射始终包含POST和GET请求中的参数,因此这会自动说明它应该工作。然而,在JSF规范中,没有明确的语句支持POST和GET。规范似乎没有明确说明这一点。感谢您为我花费的时间。祝你好运:)。Java程序员和编程语言一样优秀。
    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import javax.faces.event.ActionEvent;
    
    @ManagedBean
    @ViewScoped
    public class MyBean {
    
        Long id;
    
        @PostConstruct
        public void test() {
            System.out.println("post construct called");
        }
    
        public void actionMethod(ActionEvent event) {       
            System.out.println("action called");        
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
    }
    
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
    >
        <h:body>
    
            <f:metadata>
                <f:viewParam id="id" name="id" value="#{myBean.id}" />        
            </f:metadata>
    
            <h:outputText value="#{myBean.id}"/>
    
            <h:form>
                <h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
            </h:form>
    
            <form method="post">
                <input name="id" value="4" />
                <input type="submit" value="submit" />
            </form>
    
        </h:body>
    </html>