我尽可能清楚地说明了这个主题,但如果不是,这里的细节应该很长,但我的问题,真的很奇怪。
我希望我的解释不会让你感到困惑。在此先感谢您的帮助!
编辑:由于答案/问题不多,或许我的解释令人困惑/不愉快。 所以,这是一个简历:在两个方法之间,我可以观察到对象属性值的变化,使对象处于错误的状态。详情如下:)我有一个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());
}
答案 0 :(得分:0)
由于我没有找到任何解决方案(没有人像我看到的那样:)),我使用旁路技巧:
我在模型中放置了一个标志,在选择时设置了这个标志,在触发该方法后检索该标志中的值并用这个替换错误的值。
不像我修复我的错误那么顺利,但无论如何,它有效!