JSF Daten aus Formular werden nicht übernommen

inv_zim

Gesperrter Benutzer
Hi,

ich fange gerade an, mit JEE zu arbeiten und orierntiere mich an einem Beispiel, das ich gefunden habe.

Ich habe ein kleines Formular angelegt, um Bandnamen zu erfassen und das ganze mit JSF an eine Bean gekoppelt. Der Code:

home.xhtml
Java:
<h:form id="artistEdit">
	<h:inputText value="#{artistBean.artist.name}" id="name"/>
	<h:message for="name" styleClass="errorMessage"/>
	<br />
	<h:commandButton action="#{artistBean.save}" value="Submit" />
</h:form>

ArtistBean.java
Java:
@Named("artistBean")
@RequestScoped
public class ArtistBean {
	
	@Inject
	private ArtistDao artistDao;	
	private Artist artist = new Artist();

	public void save() {
		artistDao.persist(artist);
		artist = new Artist();
	}
	
	public Artist getArtist() {
		return artist;
	}

	public void setArtist(Artist artist) {
		this.artist = artist;
	}
}

ArtistDao.java
Java:
@Stateless
public class ArtistDao {
	
	@Inject
	@DataRepository
	private EntityManager entityManager;
	
	public void persist(Artist artist) {
		entityManager.persist(artist);
	}
	
	@SuppressWarnings("unchecked")
	public List<Artist> getAll() {
		return entityManager.createQuery("SELECT a FROM Artist a").getResultList();		
	}
	
	public Artist getArtist(int id) {
		Query query = entityManager.createQuery("SELECT a FROM Artist a WHERE id = ?");
		query.setParameter(0, id);
		return (Artist) query.getSingleResult();
	}	
}

Artist.java
Java:
@Entity
public class Artist {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	@Column
	@NotNull
	@NotEmpty
	private String name;

	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
}

Wenn ich nun den Namen eintrage und auf den Submit Button drücke, bekomme ich die Meldung, dass ein Constraint verletzt ist. Hebe ich die Constraints (@NotNull und @NotEmpty) vom Bandnamen auf, schreibt er mir <null> Werte in die Datenbank. Ich dachte eigentlich, ich hätte mich am Beispiel orientiert, aber irgendwie mag er das nicht. Findet jemand den Fehler? Ich probiere jetzt seit locker zwei Stunden daran rum...

Gruß,

Tim
 
Was bewirkt das in der Theorie, wo liegt der Unterschied zwischen den beiden? Also wie würde sich die Bean dann anders verhalten? Ich würde mir jetzt herleiten, dass die Bean vorher nur eine Request lang existiert hat, und jetzt innerhalb der Session?

Ich habe den Scope jetzt getauscht und bekomme beim Versuch, den Artist zu speichern immer noch eine ConstraintValidationException. Im Debugger sehe ich, dass die ArtistBean in der save() Methode immer noch versucht, einen Artist mit leerem Namen zu speichern.
 
Was bewirkt das in der Theorie, wo liegt der Unterschied zwischen den beiden? Also wie würde sich die Bean dann anders verhalten? Ich würde mir jetzt herleiten, dass die Bean vorher nur eine Request lang existiert hat, und jetzt innerhalb der Session?

Chapter*5.*Scopes and contexts

Ich habe den Scope jetzt getauscht und bekomme beim Versuch, den Artist zu speichern immer noch eine ConstraintValidationException. Im Debugger sehe ich, dass die ArtistBean in der save() Methode immer noch versucht, einen Artist mit leerem Namen zu speichern.

Welchen Scope mit import hast du genommen?
 
Welchen Scope mit import hast du genommen?

Den javax.faces.bean.SessionScoped.

Beim javax.enterprise.context.SessionScoped bekomme ich beim starten des JBossAS (bzw. danach beim Initialisieren des Projekts) die Fehlermeldung "Managed bean declaring a passivating scope must me passivation capable."
 
Zuletzt bearbeitet:
Den javax.faces.bean.SessionScoped.

Das ist der falsche du musst javax.enterprise.context.SessionScoped oder javax.enterprise.context.RequestScope verwenden.

Beim javax.enterprise.context.SessionScoped bekomme ich beim starten des JBossAS die Fehlermeldung "Managed bean declaring a passivating scope must me passivation capable."

Ja logo dein Objekt muss Serializable implementieren weil es beim SessionScope immer an den Client übertragen wird.
 
Vielen Dank für die Hilfe, auf manche Sachen muss man wohl mit der Nase gestoßen werden. 😳

Wünsche euch noch einen schönen Tag 🙂
 

Zurück
Oben