JSF 2复选框和布尔getter

时间:2012-06-22 13:22:49

标签: jsf jaxb jax-ws

我正在基于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;
}

2 个答案:

答案 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;
}