Как я могу вводить в @FacesConverter?

Я написал конвертер. Я использую CDI и инъекцию параллельно. В этом случае классы не вводятся. Как я могу сделать инъекцию возможной?

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}

Ответ 1

@FacesConverter не является подходящей целью инъекции. Замените его на @ManagedBean или @Named. Поскольку вы также хотели бы использовать CDI, используйте @Named.

@Named
@ApplicationScoped // I assume that your converter doesn't have any state.
public class MyConverter implements Converter {
    // ...
}

Вам нужно только изменить способ обращения к ним в представлениях. Вы больше не можете полагаться на forClass. Вам нужно явно указать его как #{myConverter}.

<h:inputSomething ... converter="#{myConverter}" />

или

<h:inputSomething ...>
    <f:converter binding="#{myConverter}" />
</h:inputSomething>

Если вам действительно нужно сохранить @FacesConverter в пользу forClass, то вам нужно будет захватить EJB вручную JNDI. Конкретный пример показан в в этой статье в блоге. Однако я не могу сказать, что для CDI beans.

Ребята из JSF подтвердили этот смущающий надзор, и они сделают @FacesConverter подходящую цель для инъекций в предстоящем JSF 2.2, см. также JSF spec issue 763 JSF 2.3.

См. также:


Обновить, если вы используете библиотеку служебных программ JSF OmniFaces или открыты для ее использования, начиная с версии 1.6, когда у вас есть OmniFaces JAR в /WEB-INF/lib, все @FacesConverter@FacesValidator s) в вашем webapp автоматически становятся доступными для инъекций CDI и EJB без каких-либо дополнительных усилий.