Java Maven 项目:更新/更改/设置具有 Primefaces 的实体的字符串值:<p:inputText/> 不起作用



#更改或设置一个带有Primfaces输入Text和Ajax的实体的字符串值#

嗨,我正在使用Java Maven项目。我试图设置我的USER实体的变量USERNAME。在我将输入插入<p:inputText/>字段后,字符串变量保持为"null"。不幸的是,我不知道我能做些什么来更新变量。

首先是实体:

package entities;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
//import javax.persistence.Table;
@Entity
public class USER implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private int USERID;

//    @OneToMany
private int VEREINSID;
private String GEBDATUM;
private String NAME;
private String USERNAME;
private String PASSWORT;
private String VEREINSTITEL;
private String ERWAERBSTAETIGKEIT;
private Double BEITRAGSSATZ;
public USER() {
}
public USER(int USERID, int VEREINSID, String GEBDATUM, String NAME, String USERNAME, String VEREINSTITEL, String ERWAERBSTAETIGKEIT, Double BEITRAGSSATZ) {
this.USERID = USERID;
this.VEREINSID = VEREINSID;
this.GEBDATUM = GEBDATUM;
this.NAME = NAME;
this.USERNAME = USERNAME;
this.VEREINSTITEL = VEREINSTITEL;
this.ERWAERBSTAETIGKEIT = ERWAERBSTAETIGKEIT;
this.BEITRAGSSATZ = BEITRAGSSATZ;
}

public USER(int USERID, int VEREINSID, String GEBDATUM, String NAME, String USERNAME, String PASSWORT, String VEREINSTITEL, String ERWAERBSTAETIGKEIT, Double BEITRAGSSATZ) {
this.USERID = USERID;
this.VEREINSID = VEREINSID;
this.GEBDATUM = GEBDATUM;
this.NAME = NAME;
this.USERNAME = USERNAME;
this.PASSWORT = PASSWORT;
this.VEREINSTITEL = VEREINSTITEL;
this.ERWAERBSTAETIGKEIT = ERWAERBSTAETIGKEIT;
this.BEITRAGSSATZ = BEITRAGSSATZ;
}
public int getUSERID() {
return USERID;
}
public void setUSERID(int USERID) {
this.USERID = USERID;
}
public int getVEREINSID() {
return VEREINSID;
}
public void setVEREINSID(int VEREINSID) {
this.VEREINSID = VEREINSID;
}
public String getGEBDATUM() {
return GEBDATUM;
}
public void setGEBDATUM(String GEBDATUM) {
this.GEBDATUM = GEBDATUM;
}
public String getNAME() {
return NAME;
}
public void setNAME(String Name) {
this.NAME = Name;
}
public String getUSERNAME() {
return USERNAME;
}
public void setUSERNAME(String USERNAME) {
this.USERNAME = USERNAME;
}
public String getPASSWORT() {
return PASSWORT;
}
public void setPASSWORT(String PASSWORT) {
this.PASSWORT = PASSWORT;
}
public String getVEREINSTITEL() {
return VEREINSTITEL;
}
public void setVEREINSTITEL(String VEREINSTITEL) {
this.VEREINSTITEL = VEREINSTITEL;
}
public String getERWAERBSTAETIGKEIT() {
return ERWAERBSTAETIGKEIT;
}
public void setERWAERBSTAETIGKEIT(String ERWAERBSTAETIGKEIT) {
this.ERWAERBSTAETIGKEIT = ERWAERBSTAETIGKEIT;
}
public Double getBEITRAGSSATZ() {
return BEITRAGSSATZ;
}
public void setBEITRAGSSATZ(Double BEITRAGSSATZ) {
this.BEITRAGSSATZ = BEITRAGSSATZ;
}

}
```
Here comes my xhtml document
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>testseite</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</h:head>
<h:body>
<h:form id="form1">
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}">
<p:ajax event="keyup"  process="@this"/>
</p:inputText>
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}"/>
</h:form>
</h:body>
</html>
```
I also tried: 
```
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}">
<p:ajax/>
</p:inputText>
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}"/>
```
and
```
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}"/>     
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}">
<p:ajax/>
</p:commandButton>
```
and
```
<p:inputText id="asdf" value="#{userManager.addUser.USERNAME}"/>     
<p:commandButton id="dssaf" action="#{userManager.insertUSER()}"/>
```

And my bean
```
package webbeans;
import entities.USER;
import db.Model;
import entities.VEREIN;
import java.io.Serializable;
//import java.sql.Connection;
//import java.sql.DriverManager;
//import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.RequestScoped;
//import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.SelectEvent;
@RequestScoped
@Named("userManager")
public class UserManager implements Serializable{
private static final long serialVersionUID = 1L;

private USER newUser;
private USER checkUser;
@Inject
private USER selectedUser;
private USER addUser;
private List<USER> newUserList = new ArrayList<>();
private List<VEREIN> newVereinsList = new ArrayList<>();
@Inject
private Model db;
@Inject
private Viewmanager vManager;
public UserManager() {
this.db = new Model();
}


@PostConstruct
public void initiate(){
addUser = new USER();
//        addUser.setUSERNAME("abc");
callNewUserList();
}

public void deleteUser(){

}

public void selectedUserAusgeben(){
System.out.println("webbeans.UserManager.selectedUserAusgeben()");

System.out.println(selectedUser.getNAME());
}

public void onRowSelect(SelectEvent<USER> event) {
selectedUser.setUSERID(event.getObject().getUSERID()); 
selectedUser.setVEREINSID(event.getObject().getVEREINSID());
selectedUser.setGEBDATUM(event.getObject().getGEBDATUM()); 
selectedUser.setNAME(event.getObject().getNAME()); 
selectedUser.setUSERNAME(event.getObject().getUSERNAME());
selectedUser.setVEREINSTITEL(event.getObject().getVEREINSTITEL()); 
selectedUser.setERWAERBSTAETIGKEIT(event.getObject().getERWAERBSTAETIGKEIT());
selectedUser.setBEITRAGSSATZ(event.getObject().getBEITRAGSSATZ());

vManager.setNewSelectedUser(this.selectedUser);

System.out.println(selectedUser.getNAME());
System.out.println(selectedUser.getUSERNAME());
System.out.println(vManager.getNewSelectedUser().getNAME());
System.out.println(vManager.getNewSelectedUser().getUSERNAME());

FacesMessage msg = new FacesMessage("User Selected", event.getObject().getNAME());
FacesContext.getCurrentInstance().addMessage(null, msg);
}

//insert new User to Database
public void insertUSER(){
System.out.println("-------------------------------------------------------------------------------------------------------------");
System.out.println(addUser.getUSERNAME());
}


// Getter und Setter
public USER getAddUser() {
return addUser;
}
public void setAddUser(USER addUser) {
this.addUser = addUser;
}

}
```

我认为这是一个范围问题。
每个Ajax-Event触发一个Request,在每个Request上你将得到一个新的Bean-Instance。
将UserManager的Scope改为viewscope .

我认为这个问题基本上是间接的一个层次太多了。与其使用value="#{userManager.addUser.USERNAME}",不如只使用两个级别,例如value="#{userManager.username}"

所以一种方法是将实体的所有字段复制为bean中的字段。然后在动作方法中的"save";commandButton (action="#{userManager.insertUSER()}"),创建实体对象("USER"),将bean中的所有单独字段复制到实体中,并持久化实体。如果你正在编辑一个实体,当然,你需要在@PostConstruct方法中做相反的事情,或者在实体被检索的时候。

更简洁的方法是使用CDI功能。在您的后台bean (UserManager)中包含实体的生产者,例如:

@Named
@Produces
@ViewScoped
private USER userEntityBean = new USER();

[不需要getter/setter。在.xhtml页面中,您可以参考value="#{userEntityBean.USERNAME}"。在"保存"中方法,只保留实体。

有点离题了,Java类名和字段名都是大写的是非常不寻常的,即使是实体(毕竟只是pojo)。

通过在构建preparedstatement之前向对象添加主键来解决问题。即使对象之前填充了所需的所有信息,在设置/更改任何属性后也会丢失这些信息。

最新更新