2009-08-01 68 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