简体   繁体   中英

Java Maven project: Update/Change/Set String Value of an Entity with Primefaces: <p:inputText/> does not work

#change or set String Value of an Entity with Primfaces input Text and Ajax#

Hi, I am using a Java Maven project. I am trying to set the Variable USERNAME of my USER Entity. I after I inserted the input into the <p:inputText/> field, the String Variable stays "null". Unfortunately, I have no more idea what I can do to update the variable.

At first the Entity:

    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;
    }
    
}
```

I think this is a Scope-Problem.
Each Ajax-Event triggers a Request and on each Request you will get a new Bean-Instance.
Change the Scope of your UserManager to ViewScoped.

I think the issue is basically one level of indirection too much. Instead of value="#{userManager.addUser.USERNAME}" , it's much better to use two levels only, such as value="#{userManager.username}" .

So one approach is the replicate all the fields of the entity as fields in the bean. Then in the action method of the "save" commandButton ( action="#{userManager.insertUSER()}" ), create the Entity object ("USER"), copy all the individual fields from the bean into entity and persist the entity. If you're editing an entity, of course, you'll need to do the reverse in the @PostConstruct method, or at the point the entity is retrieved.

A cleaner approach is to use CDI functionality. In your backing bean (UserManager) include a producer for the entity, such as:

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

[No need to have getters/setters.] In your.xhtml page you can refer to value="#{userEntityBean.USERNAME}" . In the "save" method, just persist the entity.

Somewhat off topic, it is highly unusual to have Java class names and field names all in upper case, even for entities (which are, after all, just POJOs).

The problem was solved by adding the primary key to the object before building the preparedstatement. Even if the object was filled befor with every information needed it looses the information after setting/ changing any attribute.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM