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

Mil*_*aid 6 jsf cdi managed-bean http-request-parameters managed-property

我有一个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
Run Code Online (Sandbox Code Playgroud)

domain/activate.jsf?key=98664defdb2a4f46a527043c451c3fcd&id=5但是,URL是永远不会设置和保留的属性null.

这是怎么造成的,我该如何解决?

我知道我可以从ExternalContext下面手动抓取它们:

Long id = Long.parseLong(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"), 10);
String key = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key");
Run Code Online (Sandbox Code Playgroud)

但是,我宁愿使用注射剂.

Bal*_*usC 8

特定@ManagedProperty于JSF的注释仅适用于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;
Run Code Online (Sandbox Code Playgroud)

或者,<f:viewParam>在视图中使用标记.

<f:metadata>
    <f:viewParam name="key" value="#{bean.key}" />
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

也可以看看