Я пытаюсь обновить/использовать собственный конвертер, который работал с JSF 2.2 (на Wildfly 13), для работы с JSF 2.3 (с Mojarra 2.3.9.SP02, работающим на Wildfly 17.0.1)
Преобразователь используется через собственный тег, определенный в библиотеке тегов. Все в порядке, пока не используются атрибуты тега. Атрибуты просто не заданы в конвертере. Сеттеров никогда не вызывают. Но если я удалю managed = true
из конвертера, атрибуты будут установлены, но инъекция больше не работает.
Преобразователь используется следующим образом:
<h:inputText id="text" value="#{welcome.text}">
<cdijsf:converterWithAttr id="myConverter" attr="myAttrValue" />
</h:inputText>
Библиотека тегов:
<facelet-taglib version="2.3"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_3.xsd">
<namespace>http://cdijsf.transdata.net/jsf</namespace>
<tag>
<tag-name>converterWithAttr</tag-name>
<converter>
<converter-id>cdijsf.ConverterWithAttr</converter-id>
</converter>
<attribute>
<name>attr</name>
<type>java.lang.String</type>
</attribute>
</tag>
</facelet-taglib>
А это код конвертера:
@Dependent
@FacesConverter(value = "cdijsf.ConverterWithAttr", managed = true)
public class ConverterWithAttr implements Converter<String> {
@Inject
private BeanManager beanManager;
private String attr;
public ConverterWithAttr() {
}
@PostConstruct
private void init() {
// If 'managed = true' beanManager is injected at this point.
// If 'managed = false' beanManager is null at this point
}
@Override
public String getAsObject(FacesContext context, UIComponent component, String value) {
return value;
}
@Override
public String getAsString(FacesContext context, UIComponent component, String value) {
return value;
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
// If 'managed = true' setAttr is never called
// If 'managed = false' setAttr is called
this.attr = attr;
}
}
лица-config.xml:
<faces-config version="2.3"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
</faces-config>
И я также явно объявляю JSF 2.3 следующим образом:
@FacesConfig(version = Version.JSF_2_3)
@ApplicationScoped
public class JsfConfiguration {
}
beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
version="2.0"
bean-discovery-mode="annotated">
</beans>
managed=true
позволяет, если я правильно прочитал спецификации - person Kukeltje   schedule 19.08.2019managed=true
, если я правильно понял. Что, если вы также удалите@Dependent
- person Kukeltje   schedule 19.08.2019@Dependent
к сожалению тоже не помогает. - person Heiko Tappe   schedule 19.08.2019managed=true
делает bean-компоненты инъекционными в целях, а не целью инъекций. Последний должен просто работать без `managed=true, на мой взгляд, иначе он сильно нарушает обратную совместимость. - person Kukeltje   schedule 19.08.2019