我儘可能清楚地說明了主題,但如果不是這樣,細節應該很長,但是我的問題真的很奇怪。春天不情願地改變我的豆的價值
我希望我的解釋不會讓你感到困惑。在此先感謝您的幫助!
編輯:因爲沒有太多的答案/問題,也許我的解釋是混亂/不愉快的閱讀。 所以,這是一個簡歷:在兩種方法之間,我可以觀察對象屬性值的變化,使對象處於錯誤的狀態。下面的細節:)
我有一個Spring/JSF的Web應用程序,其中包括管理用戶數據庫。 加載管理頁面時,它將數據顯示在p:dataTable(PrimeFaces)中。
問題是:當我在dataTable中選擇一行時,它會調用相應的偵聽器,它在backingBean中設置一個臨時對象。到目前爲止,所有的屬性值都對應於所選的行。但是,當我通過單擊一個按鈕來調用一個方法,並嘗試在支持bean中檢索我的對象時,它會返回正確的對象(內存地址相同),其中所有屬性都是正確的,除了一個(請參見下面)。
準確地說,當我打電話給我的偵聽器(listenerselectadmin)時,選擇的值superAdministrateur爲True。然後,當我調用方法Test()時,superAdministrateur的值爲false,但所有其他值不會更改(請參見下文)。
我切換在superAdministrateur的二傳手一個斷點,它被稱爲幾次,第一個用正確的值(true),接下來的人用錯誤的一個(假)...
有沒有方法由我在這兩個之間創建的,所以我推斷出Spring修改了這個值,但是爲什麼?
爲了證明這一點,我創建了另一個對象:admintemp。 在偵聽器中,我在backingBean的對象adminSelectionne中存儲了我的選擇。當然,Spring爲adminSelectionne提供了選擇的內存地址,所以它不必創建一個新的對象。 然後,我通過屬性在新對象adminTemp中設置屬性的值。當我這樣做時,Spring爲這個對象分配相同的內存地址,並且我爲adminTemp和adminSelectionne都生成了這個bug。
但是,如果我設置adminTemp的所有屬性與選擇只有一個,當我嘗試檢索方法測試的對象,它已被破壞(空)的值...
編輯:方法getAdministrateurModel()在對話中檢索我的MVC模型。不是問題的一部分,我通過用其他技術檢索模型來對問題進行說明。另外,我用相同的內存地址檢索我的對象,所以模型是正確的。
這是我的對象類:
@Entity
public class Administrateur implements Serializable{
private static final long serialVersionUID = 1L;
//Attributs
private int idAdministrateur;
private String numeroCP;
private boolean superAdministrateur=true;
private String superAdministrateurAnalog;
private Gerant gerant;
//Getters/Setters
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
public int getIdAdministrateur() {
return idAdministrateur;
}
public void setIdAdministrateur(int idAdministrateur) {
this.idAdministrateur = idAdministrateur;
}
@Column(unique=true)
public String getNumeroCP() {
return numeroCP;
}
public void setNumeroCP(String numeroCP) {
this.numeroCP = numeroCP;
}
public boolean isSuperAdministrateur() {
return superAdministrateur;
}
public void setSuperAdministrateur(boolean superAdministrateur) {
this.superAdministrateur = superAdministrateur;
if(superAdministrateur){
this.superAdministrateurAnalog = "Oui";
}else{
this.superAdministrateurAnalog = "Non";
}
}
@ManyToOne @JoinColumn(name="gerant_id")
public Gerant getGerant() {
return gerant;
}
public void setGerant(Gerant gerant) {
this.gerant = gerant;
}
public String getSuperAdministrateurAnalog() {
return superAdministrateurAnalog;
}
public void setSuperAdministrateurAnalog(String superAdministrateurAnalog) {
this.superAdministrateurAnalog = superAdministrateurAnalog;
}
//Constructors
public Administrateur(){
}
public Administrateur(int id, String numCP, boolean sa){
this.idAdministrateur=id;
this.numeroCP=numCP;
this.superAdministrateur=sa;
}
}
這是我的支持bean(續到所需要的代碼):
@Component
public class AdministrateurModel implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
//Attributes
private Administrateur adminselectionne = new Administrateur();
private Administrateur admintemp = new Administrateur();
//Getters/Setters
public Administrateur getAdminselectionne() {
return adminselectionne;
}
public void setAdminselectionne(Administrateur adminselectionne) {
this.adminselectionne = adminselectionne;
}
public Administrateur getAdmintemp() {
return admintemp;
}
public void setAdmintemp(Administrateur admintemp) {
this.admintemp = admintemp;
}
}
在這裏被用於此問題控制器的方法,包括:
@Controller("administrateurController")
@Scope("session")
public class AdministrateurController{
public void listenerselectadmin(SelectEvent selectEvent){
AdministrateurModel model = getAdministrateurModel();
Administrateur selection = (Administrateur) selectEvent.getObject();
model.setAdminselectionne(selection);
model.setAdmintemp(new Administrateur());
model.getAdmintemp().setGerant(selection.getGerant());
model.getAdmintemp().setNumeroCP("Test");
model.getAdmintemp().setSuperAdministrateur(selection.isSuperAdministrateur());
model.getAdmintemp().setSuperAdministrateurAnalog(selection.getSuperAdministrateurAnalog());
//flag in the model, which enable/disable buttons rendering on the JSF page
model.setDisabledAdmin(false);
}
public void test(){
AdministrateurModel model = getAdministrateurModel();
System.out.println(model.getAdminselectionne());
System.out.println(model.getAdminselectionne().getNumeroCP());
System.out.println(model.getAdminselectionne().getSuperAdministrateurAnalog());
System.out.println(model.getAdminselectionne().isSuperAdministrateur());
System.out.println(model.getAdmintemp());
System.out.println(model.getAdmintemp().getNumeroCP());
System.out.println(model.getAdmintemp().getSuperAdministrateurAnalog());
System.out.println(model.getAdmintemp().isSuperAdministrateur());
}
看起來應該可以工作 - model.setDisabledAdmin(false);雖然? – ConMan
哦,對不起,disabledAdmin是模型中的一個標記,它啓用/禁用JSF頁面上的按鈕呈現。 所以setDisabledAdmin是該標誌的經典設置器: 'public boolean isDisabledAdmin(){ \t \t \t return disabledAdmin; \t} \t公共無效setDisabledAdmin(布爾disabledAdmin){ \t \t this.disabledAdmin = disabledAdmin; \t}' – Lyro