Struts XML validation schlägt immer fehl

eldrior

Aktives Mitglied
Hallo,

ich möchte gerne bei meiner Anwendung die Validierung per XML einbauen. Ich habe mir dafür als Beispiel eine Seite genommen, bei der Notizen hinzugefügt werden sollen und vorerst lediglich geprüft, ob der Betreff vorhanden ist.
Die SaveNoteAction-validation.xml liegt im ressources Ordner unter dem entsprechenden Pfad wie die .java Datei.
Lösche ich die validation Datei, kann ich meine Notiz problemlos speichern, steht sie aber drin, wird die Notiz gar nicht gespeichert. Unabhängig davon, was ich für Validatoren eingebaut habe und ob etwas im Betreff Feld steht, oder nicht. Die Datei wird also vermutlich erkannt, aber wo liegt dann das Problem? Ich vermute, es hat etwas mit meinen Interceptor Stacks zutun...

HTML:
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="note.subject">
        <field-validator type="required">
            <message>You must enter a value for Subject!!</message>
        </field-validator>
    </field>
</validators>

Getter und Setter sind dank Lombok vorhanden.
Java:
import com.opensymphony.xwork2.ActionSupport;
import de.myCompany.ticketSystem.domain.ticketNote.NoteForm;
import de.myCompany.ticketSystem.service.NoteService;
import lombok.Getter;
import lombok.Setter;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Map;

@Getter
@Setter
public class SaveNoteAction extends ActionSupport implements SessionAware
{
    //region variables
    private final NoteService noteService;
    private       NoteForm    note;
    private       Map         session;
    //endregion

    //region methods
    public String saveNote ()
    {
        noteService.saveNote(note, (String) session.get("username"));
        return "success";
    }

    //endregion

    //region constructors
    @Autowired
    public SaveNoteAction (NoteService noteService)
    {
        this.noteService = noteService;
    }
    //endregion
}

Die Struts hab ich zur besseren Übersicht etwas gekürzt, aber hoffentlich keinen wesentlichen Teil vergessen.
Optimal wäre es, wenn man das Validieren grundsätzlich im DefaultStack (userAuthenticationStack) integrieren könnte, ich habe das zu Testzwecken jetzt getrennt. Ich habe es in einem Stack allerdings auch nicht zum Laufen bekommen.
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <!--############### USER ###############-->
    <package name="user" namespace="/user" extends="tiles-default">
        <interceptors>
            <interceptor name="authenticationInterceptor"
                         class="de.myCompany.ticketSystem.interceptor.UserAuthenticationInterceptor"/>

            <interceptor-stack name="userAuthenticationStack">
                <interceptor-ref name="store">
                    <param name="operationMode">AUTOMATIC</param>
                </interceptor-ref>
                <interceptor-ref name="authenticationInterceptor"/>
                <interceptor-ref name="timer"/>
                <interceptor-ref name="logger"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

            <interceptor-stack name="myValidationStack">
                <interceptor-ref name="store">
                    <param name="operationMode">AUTOMATIC</param>
                </interceptor-ref>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>

        </interceptors>
        <default-interceptor-ref name="userAuthenticationStack"/>
        <action name="saveNote" class="de.myCompany.ticketSystem.web.user.SaveNoteAction" method="saveNote">
            <interceptor-ref name="myValidationStack"/>
            <interceptor-ref name="userAuthenticationStack"/>
            <result name="success" type="redirectAction">
                <param name="actionName">showTicketBack</param>
                <param name="namespace">/user</param>
            </result>
            <result name="interceptorPermissionDenied" type="tiles">permissionDeniedPage</result>
            <result name="input" type="redirectAction">
                <param name="actionName">newNote</param>
                <param name="namespace">/user</param>
            </result>
        </action>
    </package>
</struts>

Falls ihr noch weitere Informationen braucht, könnt ihr gerne bescheid sagen, ansonsten bedanke ich mich schonmal bei jedem, der versucht mir bei dem Problem zu helfen.


Viele Grüße
eldrior
 

eldrior

Aktives Mitglied
Falls es jemanden interessiert, hier zumindest der erste Teil der Lösung:

HTML:
        <action name="saveNote" class="de.myCompany.ticketSystem.web.user.SaveNoteAction" method="saveNote">
            <result name="success" type="redirectAction">
                <param name="actionName">showTicketBack</param>
                <param name="namespace">/user</param>
            </result>
            <result name="interceptorPermissionDenied" type="tiles">permissionDeniedPage</result>
            <result name="input" type="tiles-User">
                notePageMain
            </result>
        </action>

Ich habe also beim result "Input" jetzt keine Action mehr hinterlegt, sondern eine in meiner tiles.xml hinterlegte definition. Das funktioniert auch, wenn ihr direkt auf die jsp verweist, dann allerdings ohne 'type="Stiles-User"'.

Ich nutze jetzt ausschließlich den authenticationInterceptor, wie er oben bereits steht und die Fehlermeldungen werden mir ebenfalls angezeigt. Die Validation funktioniert sowohl durch das Überschreiben der Methode in der Action Class, als auch per XML

Mein Problem ist jetzt allerdings folgendes:
Lege ich eine neue Notiz an und erstelle sie korrekt, wird sie gespeichert und alles ist gut. Mache ich aber einen Fehler (gebe keinen Betreff ein) und korrigiere das direkt ohne vorher raus und wieder reinzugehen, dann funktioniert der Spaß nicht mehr, weil ich in einem Hidden Field in der JSP eine ID hinterlegt habe. Die wird natürlich nicht gefüllt, wenn ich nicht über eine Action auf die Seite komme.
Ein m.E. Workaround wäre die ID einfach in der Session zu hinterlegen, aber das empfinde ich nicht als saubere Lösung.
Vielleicht weiß hier ja jemand, wie ich das intelligent lösen könnte. Wenn ich auf eine in meinen Augen gescheite Lösung komme, melde ich mich wieder.

edit: bei der Gelegenheit würde ich auch gerne den Inhalt des Textfeldes beibehalten :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Validation über ManagedBeans Web Tier 7
A JSF form absenden ohne require validation (andere schon) Web Tier 4
F JSF - Submit nach Validation-Failed Web Tier 6
K JSF Custom Validation Messages Migration von JSF 1.2 auf 2.0 Web Tier 5
J Validieren abhängiger Felder mit JEE6/Bean validation Web Tier 33
S Style bei fehlerhafter Eingabe (Bean Validation) ändern Web Tier 2
S Bean Validation (JSF 2.0) funktioniert nicht. Web Tier 4
L Struts 2 Iterator Validation Web Tier 4
D Ajax und Validation ohne große Umstrukturierung Web Tier 3
P Struts2 - Mehrere Methoden/Actions in einer Klasse + Validation Web Tier 2
L Struts Validation Error Web Tier 17
G Struts 2 Validation Web Tier 5
G Struts 2 - Validation Frage Web Tier 5
S Facelets Form: Validation abschalten bei Abbrechen-Button Web Tier 2
OnDemand JSF from Entity erstellt immer ein Feld ID Web Tier 6
eskimo328 Macht REST immer sinn? Web Tier 1
R get-methode der Managed-Bean wird immer 3 mal ausgeführt Web Tier 4
F JSF Bean funktioniert nicht immer.. Web Tier 3
S JQuery und Primefaces (Immer wieder Ärger damit) Web Tier 0
7 Struts: bei action immer ein Result nötig? Web Tier 2
I Beim zurück-Link wird immer ein Request ausgeführt Web Tier 5
N URL bei WebApp wird immer laenger Web Tier 5
Y JSF immer neu deployen Web Tier 6

Ähnliche Java Themen

Neue Themen


Oben