@ManagedProperty 未在 @Named bean 中设置请求参数

问题描述 投票:0回答:2

我有一个 CDI 托管 bean,其中我想将请求参数设置为托管属性:

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

@Named
@RequestScoped
public class ActivationBean implements Serializable {

    @ManagedProperty(value="#{param.key}")
    private String key;

    @ManagedProperty(value="#{param.id}")
    private Long id;

    // Getters+setters

URL 为

domain/activate.jsf?key=98664defdb2a4f46a527043c451c3fcd&id=5
,但属性从未设置并保持为
null

这是怎么造成的以及如何解决?

我知道我可以从

ExternalContext
手动抓取它们,如下所示:

Long id = Long.parseLong(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"), 10);
String key = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key");

但是,我宁愿使用注射。

jsf cdi managed-bean http-request-parameters managed-property
2个回答
9
投票

JSF 特定的

@ManagedProperty
注释仅适用于 JSF 托管 Bean,不适用于 CDI 托管 Bean。换句话说,它仅适用于使用 JSF 特定的
@ManagedBean
注释进行注释的类,不适用于使用 CDI 特定的
@Named
注释进行注释的类。

CDI 不提供开箱即用的注释来专门注入 HTTP 请求参数。 JSF 实用程序库 OmniFaces 提供了

@Param
注释,用于在 CDI 托管 bean 中注入 HTTP 请求参数。

@Inject @Param
private String key;

@Inject @Param
private Long id;

或者,在视图中使用

<f:viewParam>
标签。

<f:metadata>
    <f:viewParam name="key" value="#{bean.key}" />
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>

另请参阅


0
投票

问题和接受的答案都很旧了。如今,Jakarta Server Faces 允许在 @ManagedProperty

 bean 中使用 
@Inject
 以及 
@Named

@Inject @ManagedProperty("#{param.key}")
private String key;
© www.soinside.com 2019 - 2024. All rights reserved.