我有一个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
网址为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");
但是,我宁愿使用注射剂。
答案 0 :(得分:8)
特定于JSF的@ManagedProperty
注释仅适用于JSF托管bean,而不适用于CDI托管bean。换句话说,它仅适用于使用JSF特定的@ManagedBean
注释注释的类,而不适用于使用CDI特定的@Named
注释注释的类。
CDI没有提供注释,专门注入HTTP请求参数。 JSF实用程序库OmniFaces提供了@Param
annotation,用于在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>