2016-07-12 4 views
0

У меня есть фасоль:ч: selectManyCheckbox преобразователя getAsObject всегда получает "на" в изложении значения

@ManagedBean(name = "bExam") 
@SessionScoped 
public class BExam implements Serializable 
{ 
    private List<Category> categories; 
    private List<Category> categoriesSelected; 

    public BExam() { 

     categories = CategoryDb.getAll(); // there is ok. Categories has filled right. 
     categoriesSelected = new ArrayList<>(); 

     getters & setters... 
} 

Существует конвертер:

@FacesConverter("categoryConverter") 
public class CategoryConverter implements Converter<Category> { 

    @Override 
    public Category getAsObject(FacesContext fc, UIComponent uic, String string) { 
      ... 
    } 

    @Override 
    public String getAsString(FacesContext fc, UIComponent uic, Category t) { 
      return String.valueOf(t.getId()); 
    } 
} 

Существует selectManyCheckbox:

<h:selectManyCheckbox id="categories" value="#{bExam.categoriesSelected}" converter="categoryConverter"> 
    <f:selectItems 
      value="#{bExam.categories}" 
      var="category" 
      itemLabel="#{category.name}" 
      itemValue="#{category}"/> 
</h:selectManyCheckbox> 

И это модель категории:

public class Category implements Serializable 
{ 
    private int id; 
    private String name; 
    private int sortOrder; 
    private int categorySetId; 

    getters & setters... 
} 

Флажки строятся правильно. Когда я нажимаю на любой из них, в getAsObject в параметре string я всегда получаю "on". enter image description here

Что там происходит? Почему эта строка идет именно так? И как решить это?

+0

Атрибут 'value' checkboxes пуст. И я не могу понять, почему. Категории имеют данные в каждом свойстве. –

ответ

2

При нажатии на любом из них, в getAsObject в параметре строки я всегда получаю «на»

Это значение по умолчанию обозревателя для проверяемого флажка без значения. Это будет использоваться, если HTML <input type="checkbox"> не имеет атрибута value или он пуст.

По умолчанию JSF отображает getAsString(). Таким образом, это может произойти, когда фактический преобразователь возвращает null или пустую строку в getAsString(). Это также может произойти, когда (по умолчанию) HTML Renderer, связанный с <h:selectManyCheckbox>, переопределяется некорректно или даже поврежден (например, используемый по умолчанию HTML Renderer, связанный с <h:selectBooleanCheckbox>).

Причина, по которой данная проблема не видна в представленной вами информации, но ваш первый шаг заключается в том, чтобы поставить точку останова отладки в getAsString() конвертера и исследовать стек вызовов, который вызвал его визуализатор, и проверить, какое значение возвращает преобразователь ,

+0

Я потратил слишком много времени на поиск проблемы, но не нашел ничего неожиданного. Тогда я решил использовать '' подход. Спасибо BalusC за ваш ответ. –

+0

Как уже было сказано, ваш первый шаг заключается в том, чтобы поместить контрольную точку отладки в 'getAsString()' конвертера и исследовать стек вызовов, который вызвал его визуализатор, и проверить, какое значение возвращает конвертер. Пока вы ничего не рассказываете или не спрашиваете об этом, мы не можем перейти к следующему шагу. – BalusC

Смежные вопросы