@ManagedBean
@ViewScoped
public class EditMyEntity implements Serializable {
private UploadedFile uploadedFile;
@Override
public void init() {
//Init-Code
}
@Override
protected void doUpdate() {
//Code zum Updaten
}
public void handleFileUpload(FileUploadEvent event) {
FacesMessage msg;
UploadedFile file = event.getFile();
if (file.getSize() > 15728640) { //Max. 15 Mb
msg = new FacesMessage(null, file.getFileName() + " ist zu groß (max. 15 Mb).");
} else {
msg = new FacesMessage(null, file.getFileName() + " wurde hochgeladen.");
uploadedFile = file;
}
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
Rufe ich jetzt meine JSF-Seite mit “editEntity.xhtml?id=1” auf, so funktioniert alles einwandfrei. Ich kann verschiedene Eigenschaften verändern (die hier aus Gründen der Übersichtlichkeit entfernt wurden) und auch speichern. Lade ich jedoch eine neue Datei mit Hilfe von “fileUpload” hoch (was auch funktioniert) und speichere dann meine Änderungen, so bekomme ich die Meldung “Zu bearbeitende Entity nicht angegeben” (Diese Meldung wurde als requiredMessage für den ViewParam “id” definiert).
Ich nutze den FileUpload von Primefaces auch auf anderen Seiten im selben Projekt, die keinen ViewParam benötigen. Dort funktioniert alles optimal.
Hi, da du bei einem Upload die Seite sehr wahrscheinlich nicht mit dem ViewParam aufrufst, bekommst du bei dem Update diesen Fehler.
Du könntest theoretisch einfach die Seite neu laden nach deinem Update, mit dem Parameter, oder du fügst immediate="#{editMyEntity.primaryKey eq null}" zu deinem Speicherknopf…
Dann wird nicht validiert beim Speichern…
Oder du prüfst den Key in der Bean …
das mit dem immediate funktioniert leider nicht, oder nur bedingt. Beim Speichern wird zwar nicht mehr „Zu bearbeitende Entity nicht angegeben“ und die Datei wird auch ordnungsgemäß in die Datenbank geschrieben (passiert beim Aufruf der doUpdate()-Methode). Allerdings werden alle anderen Änderungen (es gibt noch einige andere Inputs auf der Seite, wie zum Beispiel Texteingabeboxen, etc.) nicht an die Bean übermittelt und somit auch nicht gespeichert.
Lade ich allerdings keine Datei hoch, ändere also nichts an fileUpload, so funktioniert alles perfekt…
Ich bin echt am verzweifeln hier :ka:
Gibt es eine Möglichkeit den Dateiupload von Primefaces so zu gestalten, dass wirklich nur die Datei zur Bean gesendet wird, ohne das a) die Seite (ohne ViewParam) neu geladen wird und b) danach die anderen Eingabefelder beim Klick auf „Speichern“ auch zur Bean übermittelt werden?
der Primefaces FileUpload funktioniert mittels AJAX, soweit ich mich erinnere (kommt wohl auch auf die Version an)?
Hast du dir die Sache mal im Debugger angeschaut? Wenn du in die FileUpload Methode springst, hast du die selbe Instanz von EditMyEntity wie wenn du in die Speichern-Methode springst? Nicht, dass du durch einen Request irgendwie aus dem ViewScope herausläufst.
Zeig mir mal bitte das gesamte Form von editEntity, mit “Vereinfachungen” ist das ein bisschen wenig.
P.S: “EditMyEntity” ist nach Konventionen kein guter Klassenname, Klassen sollten nicht nach Aktionen benannt werden.
[QUOTE=inv_zim;71983]Hi,
Hast du dir die Sache mal im Debugger angeschaut? Wenn du in die FileUpload Methode springst, hast du die selbe Instanz von EditMyEntity wie wenn du in die Speichern-Methode springst? Nicht, dass du durch einen Request irgendwie aus dem ViewScope herausläufst.
[/QUOTE]Das habe ich getan, die Methode doUpdate() wird aber nur aufgerufen, wenn ich “immediate” immer auf true setze. Dann wird auch auf das selbe Objekt zugegriffen. Auch wenn die Methode ausgeführt wird, wird “editMyEntity.entity.name” nicht aktualisiert, bzw. die neue Eingabe nicht übernommen. Gespeichert wird das Objekt aber in die Datenbank, nur wird eben der neue Inhalt des Namensfeldes nicht in das Attribut “name” der Klasse “MyEntity” übernommen. Ich nutze den PrimeFaces-FileUpload auch auf einer anderen Seite, ohne ViewParam…Dort funktioniert alles wunderbar.
Java Code:
@ViewScoped
public class EditMyEntity implements Serializable {
private long primaryKey;
private UploadedFile uploadedFile;
private MyEntity myEntity;
@Override
public void init() {
//Init-Code
//myEntity wird mit Hilfe von primaryKey gesucht
}
@Override
protected void doUpdate() {
//Code zum Updaten
//myEntity.setContract(uploadedFile.getContents());
//Datenbankupdate
}
public void handleFileUpload(FileUploadEvent event) {
FacesMessage msg;
UploadedFile file = event.getFile();
if (file.getSize() > 15728640) { //Max. 15 Mb
msg = new FacesMessage(null, file.getFileName() + " ist zu groß (max. 15 Mb).");
} else {
msg = new FacesMessage(null, file.getFileName() + " wurde hochgeladen.");
uploadedFile = file;
}
FacesContext.getCurrentInstance().addMessage(null, msg);
}
// Getter und Setter
}
@Entity
public class MyEntity{
private long primaryKey;
private String name;
private byte[] contract;
//Getter und Setter
}```
[QUOTE=inv_zim;71983]
P.S: "EditMyEntity" ist nach Konventionen kein guter Klassenname, Klassen sollten nicht nach Aktionen benannt werden.
[/QUOTE]
Wie würdest du denn die Klasse nennen?
Danke dir schonmal, dass du dich auch mit dem Problem beschäftigst