I've a CDI managed bean wherein I'd like to set request parameters as managed properties:
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
The URL is domain/activate.jsf?key=98664defdb2a4f46a527043c451c3fcd&id=5
, however the properties are never set and remain null
.
How is this caused and how can I solve it?
I am aware that I can manually grab them from ExternalContext
as below:
Long id = Long.parseLong(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id"), 10);
String key = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key");
However, I'd rather use injection.
The JSF-specific @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
annotation.
CDI does not offer an annotation out the box to inject specifically a HTTP request parameter. JSF utility library OmniFaces offers a @Param
annotation for the very purpose of injecting a HTTP request parameter in a CDI managed bean.
@Inject @Param
private String key;
@Inject @Param
private Long id;
Alternatively, use the <f:viewParam>
tag in the view.
<f:metadata>
<f:viewParam name="key" value="#{bean.key}" />
<f:viewParam name="id" value="#{bean.id}" />
</f:metadata>
See also
来源:https://stackoverflow.com/questions/28780051/managedproperty-with-request-parameter-not-set-in-a-named-bean