未在@Named bean 中设置请求参数的@ManagedProperty
@ManagedProperty with request parameter not set in a @Named bean
我有一个 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 特定的 @ManagedProperty
annotation works only in JSF managed beans, not in CDI managed beans. In other words, it works only in classes annotated with JSF-specific @ManagedBean
annotation, not in classes annotated with CDI-specific @Named
注释。
CDI 不提供开箱即用的注释来专门注入 HTTP 请求参数。 JSF 实用程序库 OmniFaces offers a @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>
另见
- ViewParam vs @ManagedProperty(value = "#{param.id}")
- How do I process GET query string URL parameters in backing bean on page load?
我有一个 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 特定的 @ManagedProperty
annotation works only in JSF managed beans, not in CDI managed beans. In other words, it works only in classes annotated with JSF-specific @ManagedBean
annotation, not in classes annotated with CDI-specific @Named
注释。
CDI 不提供开箱即用的注释来专门注入 HTTP 请求参数。 JSF 实用程序库 OmniFaces offers a @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>
另见
- ViewParam vs @ManagedProperty(value = "#{param.id}")
- How do I process GET query string URL parameters in backing bean on page load?