我有一个豆子:
@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
。
那里发生了什么?为什么这个字符串准确?怎么解决呢?
答案 0 :(得分:3)
当我点击其中任何一个时,在
getAsObject
字符串参数中我总是“开启”
这是没有值的已选中复选框的浏览器默认值。当HTML <input type="checkbox">
没有value
属性或者为空时,将使用此选项。
默认情况下,JSF在那里呈现getAsString()
值。因此,当实际转换器返回null
或getAsString()
中的空字符串时,可能会发生这种情况。如果与Renderer
关联的(默认)HTML <h:selectManyCheckbox>
以不正确的方式被覆盖,或者甚至已损坏(例如与{{1}关联的默认HTML Renderer
,也会发生这种情况。以某种方式使用代替)。
到目前为止提供的信息中看不到问题的原因,但是您的第一步是在转换器的<h:selectBooleanCheckbox>
中放置调试断点并探索渲染器调用它的调用堆栈,并检查哪个值转换器返回。