#{param}上的@ManagedProperty在@ViewScoped中不起作用

Chu*_*ham 2 jsf jsf-2 http-request-parameters view-scope

我的豆有这个:

@ManagedBean
@ViewScoped
public class BookBean implements Serializable
{       
    @ManagedProperty(value = "#{param.id}") // does not work with @ViewScoped
    private String id;

    public void init()
    {
        id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")
        if (id != null) {
            System.out.println("ID: " + id);
            currentBook = bookService.find(id);
        }
    }

    @PostConstruct
    public void post()
    {   
        // does not work with @ViewScoped
        System.out.println("ID: " + id);
        currentBook = bookService.find(id);    
    }

    public String getId() {
        return id;
    } 

    public void setId(String id) {
       this.id = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

目的地Facelet有这个:

<f:metadata>
    <f:viewParam name="id" value="#{bookBean.id}">
        <f:event type="preRenderView" listener="#{bookBean.init}" />
    </f:viewParam>
</f:metadata> 
Run Code Online (Sandbox Code Playgroud)

通过测试,我注意到@ManagedProperty并且@PostConstruct只能使用@RequestScopedbean.

对于@ViewScopedbean,我发现我必须这样做FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")以获取id参数的值.

这是获取请求参数值的唯一方法@ViewScoped吗?

有什么想法吗?

Bal*_*usC 5

视图范围比请求范围更广.在@ManagedProperty只能设置相比,管理bean的范围具有相同或更大范围的属性.

只要继续使用<f:viewParam><f:event>.你不应该只是将它们嵌套在一起.

<f:metadata>
    <f:viewParam name="id" value="#{bookBean.id}" />
    <f:event type="preRenderView" listener="#{bookBean.init}" />
</f:metadata> 
Run Code Online (Sandbox Code Playgroud)

@ManagedBean
@ViewScoped
public class BookBean implements Serializable {

    private String id;

    public void init() {
        if (id != null) {
            currentBook = bookService.find(id);
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

<f:viewParam>将设置请求参数和<f:event>这些参数的设置之后将执行侦听方法.

@PostConstruct上图的精品工程范围的豆类为好,但它只有bean的建设后直接运行,所有依赖注射设置(如@ManagedProperty,@EJB,@Inject,@Resource,等).该<f:viewParam>然而,设置属性之后,所以它不是可用@PostConstruct.