2015-04-17 54 views
2

我儘可能清楚地說明了主題,但如果不是這樣,細節應該很長,但是我的問題真的很奇怪。春天不情願地改變我的豆的價值

我希望我的解釋不會讓你感到困惑。在此先感謝您的幫助!

編輯:因爲沒有太多的答案/問題,也許我的解釋是混亂/不愉快的閱讀。 所以,這是一個簡歷:在兩種方法之間,我可以觀察對象屬性值的變化,使對象處於錯誤的狀態。下面的細節:)

我有一個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()); 
} 
+0

看起來應該可以工作 - model.setDisabledAdmin(false);雖然? – ConMan

+0

哦,對不起,disabledAdmin是模型中的一個標記,它啓用/禁用JSF頁面上的按鈕呈現。 所以setDisabledAdmin是該標誌的經典設置器: 'public boolean isDisabledAdmin(){ \t \t \t return disabledAdmin; \t} \t公共無效setDisabledAdmin(布爾disabledAdmin){ \t \t this.disabledAdmin = disabledAdmin; \t}' – Lyro

回答

0

由於我沒有找到任何解決方案(沒有人按我看到:)),我用了一個旁路技巧:

我在模型中放置了一個標誌,在選擇時設置這個標誌,在觸發該方法之後檢索這個標誌中的值,並用這個標誌替換錯誤的值。

不像我修正我的錯誤那樣流暢,但無論如何,它的工作原理!