【问题标题】:JAXB boolean handling oddities and JSFJAXB 布尔处理异常和 JSF
【发布时间】:2010-06-10 14:10:48
【问题描述】:

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

JAXB 无法正确生成布尔字段 getter 和 setter,为了向后兼容,未修复此错误。

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

  1. setXXX(布尔值)生成
  2. getXXX() 生成
    • 如果布尔属性在XSD中指定了默认值,那么getXXX()返回boolean
    • 如果布尔属性未在 XSD 中指定默认值,则 getXXX() 返回 Boolean

问题:尝试编辑/查看 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() 方法以返回布尔值而不是布尔值。

【问题讨论】:

    标签: java jsf jaxb boolean trinidad


    【解决方案1】:

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

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

    我对@9​​87654323@ 和以下吸气剂进行了快速测试:

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

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

    【讨论】:

    • 谢谢,这些都是非常好的(并且令人耳目一新:))点。我会重新调查。我们正在使用 Apache Trinidad。该属性用于值属性并使用转换器:javax.faces.Boolean。只是为了在这里有 100% 清晰的画面 - 你所有的快速测试都是用 setter 完成的:setChecked(Boolean value)?
    • 是的,尽管实际上这并不重要,因为 setter 仅在您提交表单时才有意义。
    • 仍然没有得到深入的重新调查。一旦我这样做,我会更新这个问题。感谢您分享您的专业知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2010-10-02
    • 2011-09-16
    • 2013-03-04
    • 2013-01-16
    相关资源
    最近更新 更多