JAXB布尔处理奇怪和JSF

时间:2010-06-10 14:10:48

标签: java jsf jaxb boolean trinidad

JAXB中存在一个已知错误:https://jaxb.dev.java.net/issues/show_bug.cgi?id=733

JAXB没有正确生成布尔字段的getter和setter,为了向后兼容,这个bug没有固定。

存在一个JAXB插件,它将确保生成以下用于布尔字段的getter和setter:

  1. 生成setXXX(布尔值)
  2. 生成getXXX()
    • 如果布尔属性指定XSD中的默认值,则getXXX()返回布尔
    • 如果布尔属性未在XSD中指定默认值,则getXXX()返回布尔值。
  3. 问题:尝试编辑/查看JSF组件中的XXX字段(例如复选框)不起作用 - 该组件已禁用。

    我使用Apache Trinidad 1.2。该组件编码如下:

    <tr:selectBooleanCheckbox value="#{MvsDatasetUI.object.mvsDataset.temporary}" id="temporary" converter="javax.faces.Boolean" />
    

    我没有深入追踪这一点,但假设(由下面的解决方法支持)是JSF EL解析器(或whathaveyou)寻找布尔getXXX()方法,因为它找不到它,组件是禁用。

    解决方法:如果我将getXXX()方法更改为返回布尔值,那么一切都会进行。

    问题

    • 您对如何以最快的方式解决这个问题有什么想法?
      • 我是否错过了boolean-getter JAXB插件的一些自定义?
    • 是否有可能(有意义)更改JSF解析器(或whathaveyou ),以便如果找不到布尔值getXXX(),它将回退到布尔值getXXX()?

    我不想手动干预并更改所有生成的getXXX()方法以返回布尔值而不是布尔值。

1 个答案:

答案 0 :(得分:1)

  

问题 :尝试编辑/查看JSF组件中的XXX字段(例如复选框)不起作用 - 该组件已禁用。

我已经和JSF合作了很长时间,但我从未在JSF中看到过这个特殊问题。从技术上讲,组件根据其值的类型被禁用也是不可能的。每当找不到属性或值类型不可转换时,它宁愿抛出PropertyNotFoundExceptionConverterException

我使用<h:selectBooleanCheckbox value="#{bean.checked}" />和以下的getter进行了快速测试:

  • public boolean isChecked()工作正常。
  • public boolean getChecked()工作正常。
  • public Boolean isChecked()在渲染过程中抛出PropertyNotFoundException(正确)。
  • public Boolean getChecked()工作正常。

根据这些信息,我将重新调查问题并审查结论。您是否使用了自己未编写的自动生成或第三方JSF代码?你仔细检查过JSF代码了吗?是不是只在某个disabled属性中使用此属性? Boolean的默认值为null,而boolean的默认值为falsenullfalse在EL中的行为都不同。