2009-08-01 85 views
0

在我的项目中,我们使用JSF 1.2和JBOSS 5开发了一个项目。作为新需求的一部分,我们必须将它迁移到Websphere 7.但是我们遇到了一个我怀疑与java运行时相关的问题被WAS内部使用。它不能autobox int/Integers,将字符串长时间隐式转换。终于提供了必要的检查后,我被困在以下验证异常处:Websphere 7 JSF

/Star/employeeFormP1.jsp(226,4)'#{StarEmployeeApplicationFormBean.medicalHMO}'无法在类上设置属性'medicalHMO' 'com.idea.app.bean.StarEmployeeApplicationFormBean'来赋值'true'。

以下相关代码:

<h:selectBooleanCheckbox id="checkbox1" 
     value="#{StarEmployeeApplicationFormBean.medicalHMO}" 
     title="click it to select or deselect" 
     immediate="true" 
     valueChangeListener="#{StarEmployeeApplicationFormBean.listHMOMedProducts}" 
     onchange="return submit()" /> 

任何人都可以请帮我在这验证异常?

+0

StarEmployeeApplicationFormBean.medicalHMO的getter/setter类型是什么? – McDowell 2009-08-01 15:55:09

+0

@McDowell bean中的medicalHMO属性类型为String。我知道它应该是布尔型的selectBooleanCheckbox,但所有的开发者都没有。 :P 将它更改为布尔值可以做到这一点。但奇怪的是,它在JBoss中正常工作没有问题。这些值被设置为“真”/“假”作为字符串。关于为什么它可以在JBoss中工作的任何线索?是否有任何不同版本的JSF参与? – Barun 2009-08-02 12:44:05

回答

1

的JBoss 5 WebSphere 7是JEE5服务器,因此JSF 1.2 impl只会使用该平台提供的EL实现。对于类型强制的规则在the JSP 2.1 spec详细:

例如,如果强迫一个int一个字符串,“盒子”整型成整数,并应用规则强迫一个整数的字符串。或者,如果强制将字符串强制为双精度型,则应用强制将字符串强制为双精度型的规则,然后对结果Double进行“取消装箱”,确保生成的Double实际上不为null。

根据规范中详述的规则,这听起来像是WebSphere实现中的一个错误。如果您找不到解决该问题的现有APAR/Fix Pack,我会报告它。

0

我不确定问题到底是什么。我刚才几点意见:

  1. “......这不是能够autobox INT /整数...” - 谷歌告诉我,这是7使用JDK 5,which does autoboxing。也许你应该检查一下,以确保你的应用服务器使用正确版本的JVM。
  2. “......将字符串长时间隐式地转换......” - 我不相信任何JVM都会这样做。

    /Star/employeeFormP1.jsp(226,4) “#{} StarEmployeeApplicationFormBean.medicalHMO:

提供必要的检查 它终于我停留在 以下验证异常后' 无法将 类 'com.idea.app.bean.StarEmployeeApplicationFormBean' 上的property'medicalHMO'设置为值'true'。

很难说没有发布一些代码。

0

WAS 7.0实际使用JDK 1.6,WAS 6.1使用JDK 1.5。

自动装箱对我的作品,诠释为Integer等

我同意的意见,即字符串原始类型转换是不是“自动装箱”的一部分。

medicalHMO的setter是你的问题的关键,它期望什么类型?

如果,例如,您有setMedicalHMO(字符串NEWVALUE){...}

它可能是有趣添加另一个二传手setBooleanMedicalHMO(布尔NEWVALUE){...}

0

它可能是你使用的IBM JVM我注意到一个错误,而如果你使用==来比较一个int和一个long值相同的值,它会自动装箱并返回false

例如,使用此方法:

public boolean amIEqual(int myInt, long myLong){ 
    return myInt == myLong; 
} 

amIEqual(3,3)false上我用的是IBM JVM。

为了解决这个问题,我明确地使用对象类型:

public boolean amIEqual(Integer myInt, Long myLong){ 
    return myInt.equals(myLong); 
} 

现在,amIEqual(3,3)突然变得true