2017-01-04 12 views
0
<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); 
    } 
} 
+0

Пожалуйста прочитайте этот очень интересный пост [CDI Bean] (http://stackoverflow.com/questions/4347374/backing-beans-managedbean-or-cdi-beans-named) –

ответ

0

В вашем фрагменте кода вы определяете конвертер как converter="#{stringFilterConverter}" однако я думаю, что вы не должны обернуть имя вашего преобразователя с синтаксисом выражения EL, поэтому правильное использование преобразователя должно быть:

<p:selectOneMenu id="tag1" value="#{attachmentManagement.tag1} converter="stringFilterConverter"/> 

(я, конечно, предположить, что ваш конвертер класс реализации имеет аннотацию @FacesConverter("stringFilterConverter"))

+0

Реализация моего конвертера - это CDI-компонент. Я нашел решение. Я меняю область действия конвертера по умолчанию на область приложения. И теперь конвертер работает. Но почему? – vipcxj

+0

Не могли бы вы обновить свой ответ с помощью конвертера? –