我正在基于webservice生成一个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()
然而,由于webservices的大小和数量,手动更新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;
}
答案 0 :(得分:4)
Jaxb将使用java.lang.Boolean而不是基本类型生成布尔值。除此之外,它还将为bean生成is()命名约定。
对is
使用java.lang.Boolean
getter前缀是JAXB的一个已知重大错误。 It has been fixed in version 2.1.13已于2010年4月发布。让您的图书馆保持最新状态。
有关背景信息,另请参阅this blog article。
伟大的JAXB API错误
2006年9月15日
你必须把它交给Sun来解决这个问题。当文档与教科书一样厚时,编写不符合规范的软件是一回事。举个例子来说,就是W3C创造的任何东西。然而,当你自己的规范无法遵循时,它真的很糟糕,特别是当它是最知名的部分时。没错,在他们创建JAXB 2.0 API时,Sun在他们自己的规范上错过了一英里。在为java.lang.Boolean属性生成getter方法时,JAXB 2.0编译器(XJC)错误地使用前缀“is”而不是“get”。虽然JavaBean规范指出原始布尔值的读取方法可以使用备用“is”前缀,但这种灵活性并没有扩展到它的布尔包装器对应物。
8.3.2布尔属性
此外,对于布尔属性,我们允许getter方法匹配模式:
public boolean is();
可以提供这种“是”方法而不是“获取”方法,或者除了“获取”方法之外还可以提供它。在任何一种情况下,如果布尔属性存在“is”方法,那么我们将使用“is”方法来读取属性值。
示例布尔属性可能是:
public boolean isMarsupial(); public void setMarsupial(boolean m);
鉴于JAXB是一个代码生成框架,代码生成框架背后的想法是代码将“按原样”使用,之后不再修改,这是一个非常大的“oops”。虽然已经报道了这个问题,但Sun的反应是“抱歉,为时已晚”。
这种行为受规范的约束,不幸的是现在规范改变为时已晚。
就用户体验而言,感谢自动拳击,我不认为这对人们来说是一个真正的问题。问题是您使用的是Introspector并且它缺少属性? 太晚了?不是真正的问题吗?这是破产。修理它!我也不喜欢它可能不会影响框架的天真声明。嗯,是的,考虑到其他项目确实符合规范(hibernate,spring,myfaces等)。
更新:Stevo Slavic告诉我,这已在JAXB 2.1.13中修复。有关详细信息,请参阅JAXB-131。呀!
JSF / EL在这里没有错。它的工作正确地符合JavaBeans spec。
答案 1 :(得分:3)
我不确定为什么最新和最好的JAXB版本仍会生成错误的方法,但我最后通过在wsimport调用中添加“-B-enableIntrospection”(根据http://jaxb.java.net/2.2.4/docs/xjc.html)来修复它。这导致:
public Boolean getOptional() {
return optional;
}