<p:selectOneMenu id="tag1" value="#{attachmentManagement.tag1}" converter="#{stringFilterConverter}">
<f:selectItems value="#{attachmentManagement.tag1List}" var="tag1" itemLabel="#{not empty tag1.value ? tag1.value : '无'}"/>
</p:selectOneMenu>
<p:commandButton value="button" actionListener="#{attachmentManagement.someFuction()}"/>
При нажатии на кнопку, это исключение бросили:конвертер в JSF не работает
javax.faces.component.UpdateModelException: java.lang.IllegalArgumentException: Cannot convert [email protected] of type class java.lang.String to class com.bolan.fzsystem.appserver.view.model.StringFilter
....
Caused by: java.lang.IllegalArgumentException: Cannot convert [email protected] of type class java.lang.String to class com.bolan.fzsystem.appserver.view.model.StringFilter
....
stringFilterConverter и SomeFunction не вызывается вообще. Поскольку я установил конвертер, почему jsf не использует его и использует toString() для обновления значения.
Реализация моего конвертера - это CDI bean. Я нашел решение. Я меняю область действия конвертера по умолчанию на область приложения. И теперь конвертер работает. Но почему?
Это моя реализация преобразователя:
@Named
@ApplicationScoped //change scope from default to this
public class StringFilterConverter implements Converter, Serializable {
private static final long serialVersionUID = -6691961589607931061L;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.isEmpty()) {
return ValueFilter.UNDEFINE;
}
return JSON.parseObject(value, new TypeReference<String>() {});
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
ValueFilter<String> filter = (ValueFilter<String>) value;
return JSON.toJSONString(filter);
}
}
Пожалуйста прочитайте этот очень интересный пост [CDI Bean] (http://stackoverflow.com/questions/4347374/backing-beans-managedbean-or-cdi-beans-named) –