【问题标题】:h:selectManyCheckbox converter's getAsObject always retrieves "on" as submitted valueh:selectManyCheckbox 转换器的 getAsObject 总是检索“on”作为提交的值
【发布时间】:2016-07-12 13:45:57
【问题描述】:

我有一颗豆子:

@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"

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

【问题讨论】:

  • Checkboxes 的value 属性为空..我不明白为什么.. 类别在每个属性中都有数据。

标签: jsf converter selectmanycheckbox


【解决方案1】:

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

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

默认情况下,JSF 在那里呈现getAsString() 值。因此,当实际转换器返回nullgetAsString() 中的空字符串时,可能会发生这种情况。当与&lt;h:selectManyCheckbox&gt; 关联的(默认)HTML Renderer 以不正确的方式被覆盖,甚至被破坏时(例如,与&lt;h:selectBooleanCheckbox&gt; 关联的默认 HTML Renderer 以某种方式被使用,它也可能发生)而是)。

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

【讨论】:

  • 我确实花了太多时间搜索问题,但不幸的是没有找到。然后我决定使用&lt;h:selectBooleanCheckbox&gt; 方法。感谢 BalusC 的回答。
  • 作为回答,您的第一步是在转换器的getAsString() 中放置一个调试断点,并探索渲染器调用它的调用堆栈,并检查转换器返回的值。只要您不告诉或询问任何相关内容,我们就无法进行下一步。
猜你喜欢
  • 2013-05-02
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2015-11-16
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多