我们在我们的数据库中有数值,表示一个两值状态。当然这会完全匹配一个布尔值,但是oracle没有这样的数据类型。数据库中的NUMBER(1,0)类型与Java中的java.lang.Short类型相匹配(有时它们使用NUMBER(*,0)表示布尔值,它们与java.math.BigDecimal匹配)。如何在JSF中注册自定义渲染器?
由于它在某种程度上是显而易见的,我想提供ice:视图中的selectBooleanCheckbox作为值表示,UIComponent提供给用户。 (我使用IceFaces作为JSF实现)
由于一些指定JSF的人认为总是匹配ice的值:selectBooleanCheckbox或在JSF中h:selectBooleanCheckbox为模型中的布尔值,所以渲染器组件永远不会调用任何转换器,即使你指定一个: Issue disscused at java.net
所以我尝试了以下内容:
我创建了一个转换器的UIComponent指定它:
public class BooleanBigDecimalConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String str) {
if (StringUtils.isEmptyString(str)) {
return new BigDecimal(0);
}
if (str.equals("true")) {
return new BigDecimal(1);
} else {
return new BigDecimal(0);
}
}
public String getAsString(FacesContext context, UIComponent component, Object obj) {
if (obj != null) {
String str = obj.toString();
if (str.equalsIgnoreCase("1")
|| str.equalsIgnoreCase("yes")
|| str.equalsIgnoreCase("true")
|| str.equalsIgnoreCase("on")) {
return "true";
} else {
return "false";
}
}
return "false";
}
}
转换器对于渲染阶段(getAsString方法被正确调用)正常工作,但是getAsObject方法(忽略它现在不正确,因为它不被调用,因此如果它被调用它将被修复! )永远不会被调用,因为在UIComponent中渲染器转换器没有预见到,就像你可以在这里看到(从com.icesoft.faces.renderkit.dom_html_basic.CheckboxRenderer剪断):
public Object getConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object submittedValue) throws ConverterException
{
if(!(submittedValue instanceof String))
throw new ConverterException("Expecting submittedValue to be String");
else
return Boolean.valueOf((String)submittedValue);
}
因此,这导致一个IllegalArgumentException,因为在UpdateModelValues阶段,它试图将布尔值应用于数值(请忽略BigDecimal/Short混淆......在任何情况下它都只是一个数字类型!)。
所以,我试图用一个新的像这样覆盖渲染器:
import com.icesoft.faces.component.ext.renderkit.CheckboxRenderer;
public class CustomHtmlSelectBooleanCheckbox extends CheckboxRenderer {
public Object getConvertedValue(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException {
Converter converter = ((ValueHolder) component).getConverter();
return converter.getAsObject(context, component, (String) submittedValue);
}
}
,并在faces-config.xml中注册这样的:
<render-kit>
<renderer>
<component-family>com.icesoft.faces.HtmlSelectBooleanCheckbox</component-family>
<renderer-type>com.icesoft.faces.Checkbox</renderer-type>
<renderer-class>com.myapp.web.util.CustomHtmlSelectBooleanCheckbox</renderer-class>
</renderer>
</render-kit>
我想这应该是正确的,但重写的方法“getConvertedValue”永远不会被调用,也不会调用getAsObject()方法,所以我想我在注册自定义渲染器时犯了一个错误,但我找不到任何更多文档或提示如何正确执行此操作特别是如何找到正确的组件系列(我查了一个我在icefaces.taglib.xml中使用)和正确的渲染器类型。
因为这个,我不想编辑完整的模型。任何提示,如何解决这个问题?
我正在运行Mojarra 2.0.2,无法从我的类路径中找到'FacesConfigurator'。这是ICEFaces唯一的课程吗? – 2011-01-05 14:10:34