Struts XML validation schlägt immer fehl

Diskutiere XML validation schlägt immer fehl im Web Tier Forum; 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...

  1. eldrior
    eldrior 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...

    SaveNoteAction-validation.xml (open)

    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.
    SaveNoteAction.java (open)

    Code (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.
    Ausschnitt aus meiner Struts (open)

    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
     
  2. eldrior
    eldrior Mitglied
    Falls es jemanden interessiert, hier zumindest der erste Teil der Lösung:

    Struts -> saveNote (open)

    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 :)
     
Die Seite wird geladen...

XML validation schlägt immer fehl - Ähnliche Themen

Validation über ManagedBeans
Validation über ManagedBeans im Forum Web Tier
form absenden ohne require validation (andere schon)
form absenden ohne require validation (andere schon) im Forum Web Tier
JSF Bean Validation in Tomcat 8
JSF Bean Validation in Tomcat 8 im Forum Deployment
Simple Validation Library
Simple Validation Library im Forum IDEs und Tools
Validation - keine Annotations gefunden
Validation - keine Annotations gefunden im Forum Data Tier
Thema: XML validation schlägt immer fehl