@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>

Смотрите также

Другие вопросы по тегам