0

我有一个豆子:

@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...
}

复选框是正确的。当我点击其中任何一个时,getAsObjectstring参数中我总是得到"on". 在此处输入图像描述

那里发生了什么?为什么这个字符串恰好来了?以及如何解决?

4

1 回答 1

3

当我点击它们中的任何一个时,getAsObject在字符串参数中我总是得到“on”

这是没有值的选中复选框的浏览器默认值。这将在 HTML<input type="checkbox">没有value属性或为空时使用。

默认情况下,JSFgetAsString()在那里呈现值。因此,当实际的转换器返回nullgetAsString(). Renderer当与关联的(默认)HTML<h:selectManyCheckbox>以不正确的方式被覆盖,甚至被破坏(例如,Renderer与关联的默认 HTML<h:selectBooleanCheckbox>以某种方式被使用)时,也会发生这种情况。

到目前为止提供的信息中看不到问题的原因,但您的第一步是在getAsString()转换器中放置一个调试断点并探索渲染器调用它的调用堆栈,并检查转换器返回的值。

于 2016-07-12T14:08:26.147 回答