我尽可能清楚地说明了主题,但如果不是这样,细节应该很长,但是我的问题真的很奇怪。春天不情愿地改变我的豆的价值
我希望我的解释不会让你感到困惑。在此先感谢您的帮助!
编辑:因为没有太多的答案/问题,也许我的解释是混乱/不愉快的阅读。 所以,这是一个简历:在两种方法之间,我可以观察对象属性值的变化,使对象处于错误的状态。下面的细节:)
我有一个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