h:selectManyCheckbox转换器的getAsObject总是以提交的值检索“on”

时间:2016-07-12 13:45:58

标签: jsf converter selectmanycheckbox

我有一个豆子:

@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"总是得到class Dictionary attr_reader :content def initialize @content = [] end def self.load(path) instance = new File.open(path) do |f| f.each_line do |line| instance.content << %i(south, north, meaning).zip(line.split(',')) end end instance end end enter image description here

那里发生了什么?为什么这个字符串准确?怎么解决呢?

1 个答案:

答案 0 :(得分:3)

  

当我点击其中任何一个时,在getAsObject字符串参数中我总是“开启”

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

默认情况下,JSF在那里呈现getAsString()值。因此,当实际转换器返回nullgetAsString()中的空字符串时,可能会发生这种情况。如果与Renderer关联的(默认)HTML <h:selectManyCheckbox>以不正确的方式被覆盖,或者甚至已损坏(例如与{{1}关联的默认HTML Renderer,也会发生这种情况。以某种方式使用代替)。

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