Spring不情愿地改变了我的Bean中的值

时间:2015-04-17 11:21:03

标签: java spring spring-mvc javabeans

我尽可能清楚地说明了这个主题,但如果不是,这里的细节应该很长,但我的问题,真的很奇怪。

我希望我的解释不会让你感到困惑。在此先感谢您的帮助!

编辑:由于答案/问题不多,或许我的解释令人困惑/不愉快。 所以,这是一个简历:在两个方法之间,我可以观察到对象属性值的变化,使对象处于错误的状态。详情如下:)

我有一个Spring / JSF webapp,除其他外,它管理用户数据库。 加载管理页面时,它会在p:dataTable(PrimeFaces)中显示数据。

问题是:当我在dataTable中选择一行时,它会调用相应的侦听器,该侦听器在我的backingBean中设置一个临时对象。到目前为止,所有属性值都对应于所选行。

但是,当我通过单击按钮调用方法,并尝试在辅助bean中检索我的对象时,它返回正确的对象(内存地址相同),所有属性都正确,除了一个(见下文) )。

准确地说,当我调用我的Listener(listenerselectadmin)时,选择的值superAdministrateur为True。然后,当我调用方法Test()时,superAdministrateur的值为false,但所有其他值都没有更改(见下文)。

我在superAdministrateur的setter中切换了一个断点,它被多次调用,第一个具有正确的值(true),下一个具有错误的值(false)......

这两者之间没有我创建的方法,所以我推断Spring修改了值,但为什么呢?

为了证明这一点,我创建了另一个对象:admintemp。 在监听器中,我将我的选择存储在backingBean中的对象adminSelectionne中。当然,Spring为adminSelectionne提供了选择的内存地址,因此它不必创建新对象。 然后,我按属性设置属性,新对象adminTemp中的选择值。当我这样做时,Spring为这个对象分配了相同的内存地址,并且我已经为adminTemp和adminSelectionne生成了错误。

但是,如果我使用选择的值设置adminTemp的所有属性,但是当我尝试在方法测试中检索对象时,它已被销毁(null)......

编辑:方法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;
}
}

这是我的Backing 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方法:

@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());
}

1 个答案:

答案 0 :(得分:0)

由于我没有找到任何解决方案(没有人像我看到的那样:)),我使用旁路技巧:

我在模型中放置了一个标志,在选择时设置了这个标志,在触发该方法后检索该标志中的值并用这个替换错误的值。

不像我修复我的错误那么顺利,但无论如何,它有效!