2015-04-17 50 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

由于我没有找到任何解决方案(没有人按我看到:)),我用了一个旁路技巧:

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

不像我修正我的错误那样流畅,但无论如何,它的工作原理!