Jsf h:选择多个复选框转换器';s getAsObject始终检索“0”;关于;作为提交值

Jsf h:选择多个复选框转换器';s getAsObject始终检索“0”;关于;作为提交值,jsf,converter,selectmanycheckbox,Jsf,Converter,Selectmanycheckbox,我有一颗豆子: @ManagedBean(name = "bExam") @SessionScoped public class BExam implements Serializable { private List<Category> categories; private List<Category> categoriesSelected; public BExam() { categories = CategoryDb.

我有一颗豆子:

@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...
 }
复选框是正确的。当我单击其中任何一个参数时,在
getAsObject
string
参数中,我总是在“上获得
”。

那里发生了什么事?为什么这根绳子正好来了?如何解决

当我单击其中任何一个时,在字符串参数中的
getAsObject

这是无值复选框的浏览器默认值。当HTML
没有
属性或属性为空时,将使用此选项

默认情况下,JSF在那里呈现
getAsString()
值。因此,当实际转换器返回
null
getAsString()
中的空字符串时,可能会发生这种情况。当与
关联的(默认)HTML
呈现程序
以不正确的方式被覆盖,或者甚至被损坏时(例如,与
关联的默认HTML
呈现程序
以某种方式被使用),也会发生这种情况

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

当我单击其中任何一个时,在字符串参数中的
getAsObject

这是无值复选框的浏览器默认值。当HTML
没有
属性或属性为空时,将使用此选项

默认情况下,JSF在那里呈现
getAsString()
值。因此,当实际转换器返回
null
getAsString()
中的空字符串时,可能会发生这种情况。当与
关联的(默认)HTML
呈现程序
以不正确的方式被覆盖,或者甚至被损坏时(例如,与
关联的默认HTML
呈现程序
以某种方式被使用),也会发生这种情况


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

复选框的
value
属性为空..我不明白为什么。。类别在每个属性中都有数据。复选框的
value
属性为空..我不明白为什么。。类别在每个属性中都有数据。我确实花了太多时间搜索问题,但不幸的是并没有找到。然后我决定使用
方法。感谢BalusC的回答。正如所回答的,您的第一步是在转换器的
getAsString()
中放置一个调试断点,探索渲染器调用它的调用堆栈,并检查转换器返回的值。只要你不告诉或问任何关于这个问题的事情,我们就不能进入下一步。我确实花了太多的时间来搜索这个问题,但不幸的是没有找到。然后我决定使用
方法。感谢BalusC的回答。正如所回答的,您的第一步是在转换器的
getAsString()
中放置一个调试断点,探索渲染器调用它的调用堆栈,并检查转换器返回的值。只要你不告诉或问任何关于这件事的事情,我们就不能进入下一步。
@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());
     }
}
<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...
}