2

我正在生成一个基于 web 服务的 jaxws 客户端。Jaxb 将使用 java.lang.Boolean 而不是原始类型生成布尔值。除此之外,它还会为 bean 生成 is() 命名约定。

但是,如果我尝试将布尔值(例如 isOptional())链接到复选框,它将引发以下异常:

value="#{property.optional}": Property 'optional' not readable on type java.lang.Boolean

我的谷歌技能告诉我 jsf 适用于:

 boolean isOptional()
 boolean getOptional()
 Boolean getOptional()

但不与

Boolean isOptional()

但是,由于 web 服务的大小和数量,手动更新 bean 是不可行的,那么有什么方法可以让 jsf 正确使用 java.lang.Boolean isOptional() 吗?或者我可以在生成时以某种方式在 jaxb 绑定文件中定义一个属性,该属性会神奇地生成“getOptional()”吗?

在旁注中,以下确实有效:

<h:selectBooleanCheckbox value="#{property.isOptional()}"/>

但是我可能实际上无法更新该值,因为它找不到设置器。

编辑:我正在运行最新的 jdk 7,“java -version”的输出:

java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)

“wsimport -version”的输出:

JAX-WS RI 2.2.4-b01

生成的代码:

public Boolean isOptional() {
    return optional;
}
4

2 回答 2

4

Jaxb 将使用 java.lang.Boolean 而不是原始类型生成布尔值。除此之外,它还会为 bean 生成 is() 命名约定。

使用isgetter 前缀java.lang.Boolean是 JAXB 的一个已知重大错误。它已在2010 年 4 月发布的版本 2.1.13 中得到修复。使您的库保持最新。

另请参阅此博客文章了解一些背景信息。

伟大的 JAXB API 错误

2006 年 9 月 15 日

你必须把它交给 Sun 来解决这个问题。当文档像教科书一样厚时,编写不符合规范的软件是一回事。举个例子,W3C 创建的任何东西。但是,当它是您自己的规范而您无法遵循时,这真的很糟糕,尤其是当它是其中最知名的部分时。没错,Sun 在创建 JAXB 2.0 API 时在他们自己的规范上差了一英里。在为 java.lang.Boolean 属性生成 getter 方法时,JAXB 2.0 编译器 (XJC) 错误地使用了前缀“is”而不是“get”。虽然 JavaBean 规范声明原始布尔值的读取方法可以使用替代的“is”前缀,但这种灵活性并未扩展到其布尔包装器对应物。

8.3.2 布尔属性

此外,对于布尔属性,我们允许使用 getter 方法来匹配模式:

public boolean is();

可以提供该“is”方法来代替“get”方法,或者可以在“get”方法之外提供它。在任何一种情况下,如果布尔属性存在“is”方法,那么我们将使用“is”方法来读取属性值。

一个示例布尔属性可能是:

public boolean isMarsupial();
public void setMarsupial(boolean m);

鉴于 JAXB 是一个代码生成框架,并且代码生成框架背后的想法是代码将“按原样”使用,此后不得修改,这是一个相当大的“糟糕”。虽然已报告此问题,但 Sun 的回应是“抱歉,为时已晚”。

这种行为受规范控制,不幸的是,现在改变规范为时已晚。

在用户体验方面,多亏了自动装箱,我不认为这对人们来说是一个真正的问题。您使用 Introspector 的问题是它缺少该属性吗?太晚了?不是真正的问题吗?它坏了。修理它!我也不喜欢它可能不会影响框架的天真说法。嗯,是的,考虑到其他项目确实符合规范(hibernate、spring、myfaces 等)

更新: Stevo Slavic 告诉我,这已在 JAXB 2.1.13 中修复。有关详细信息,请参阅JAXB-131。是的!

JSF/EL 在这里没有错。它的工作符合JavaBeans 规范

于 2012-06-22T13:32:31.680 回答
3

我不确定为什么最新最好的 JAXB 版本仍然会生成错误的方法,但我最终通过添加“-B-enableIntrospection”(根据http://jaxb.java.net/2.2.4/docs/xjc .html ) 到 wsimport 调用。这导致:

public Boolean getOptional() {
    return optional;
}
于 2012-06-25T05:36:56.870 回答