6

我有一个 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");

但是,我宁愿使用注射。

4

1 回答 1

8

特定于 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>

也可以看看

于 2015-03-02T06:03:35.327 回答