@ManagedProperty с параметром запроса, не установленным в бине @Named
У меня есть управляемый компонент CDI, в котором я хотел бы установить параметры запроса в качестве управляемых свойств:
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");
Тем не менее, я бы предпочел использовать инъекции.
1 ответ
JSF-специфичный @ManagedProperty
аннотация работает только в управляемых компонентах JSF, но не в управляемых компонентах CDI. Другими словами, он работает только в классах, аннотированных JSF-специфичными @ManagedBean
аннотации, не в классах, аннотированных CDI-специфичными @Named
аннотаций.
CDI не предлагает аннотацию из коробки, чтобы вводить конкретно параметр запроса HTTP. Утилита JSF OmniFaces предлагает @Param
аннотация для самой цели введения параметра запроса HTTP в управляемый компонент CDI.
@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>