2016-04-13 10 views
2

Zuerst verwende ich einfaches Thema, aber auch ohne es das gleiche Verhalten auftritt (außer Seitenformatierung). Wenn ich das Formular absende, wird das Namensfeld leer und leitet zu register.jsp um, ohne den Validierungsfehler anzuzeigen. Nach dem Überprüfen der Protokolle oder des Debuggers scheint die Validierung ordnungsgemäß zu funktionieren und die Serverprotokollmeldungen werden wie erwartet geschrieben. Ich poste generischen Code.Struts2 Validierung funktioniert nicht richtig, Validierungsfehlermeldungen werden nicht angezeigt

struts.properties

struts.ui.theme=simple 

MyAction

private User user = new User() // getter and setter 

@Inject 
transient UserDAO userDAO; 

@Override 
public User getModel() { 
    return user; 
} 

public void validate(){ 

    LOG.debug("NAME VALIDATION " + user.getName()); 
    if("".equals(user.getName())){ 
     addFieldError("user.name", "Name can't be empty"); 
     LOG.debug("Validation Error on name"); 
    }  
} 

mit Debugger Karo, Validate-Methode arbeitet und Protokolle geschrieben werden.

struts.xml

<package name="users" extends="struts-default"> 
    <action name="registerUser" method="prepareRegister" class="com.test.MyAction"> 
     <result name="success">/register.jsp</result> 
    </action> 

    <action name="saveOrUpdateUser" method="saveOrUpdate" class="com.test.MyAction"> 
     <result name="input" type="redirect">registerUser</result> 
     <result name="success" type="redirect">listUser</result> 
    </action> 
</package> 

register.jsp

<td> 
    <s:textfield id = "userName" 
       label = "User Name" 
       name = "user.name" /> 
</td> 
<s:fielderror fieldName = "user.name" /> 

Fühlen Sie sich frei mich um Klärung zu bitten. Ich bin ziemlich neu zu Struts 2, ich habe versucht, die Struts 2 Dokumentation Validierung, und prüfte auch andere Tutorials. Ich weiß nicht, ob ich etwas vermisse oder ich habe eine Fehlkonfiguration, die ich nicht bemerke, da die Logik funktioniert und der Ansichtsteil (jsp) nicht. Danke im Voraus.

+1

'getModel()' - mit model-driven? Hör auf es zu benutzen. –

+0

@Aleksandr M: Wenn dies mit meinem Problem verbunden ist, werde ich :) – manu

+0

'redirect' wird alle Fehler entfernen. Nicht umleiten. Und im Allgemeinen sollte 'redirectAction' verwendet werden, um zu einer Aktion umzuleiten. –

Antwort

2

Nach how the INPUT result works gelesen und das Muster Modellgetriebene Design verlassen zu haben, die nichts auf Ihre Programmiererfahrung außer Probleme ergänzt, die leicht hide themselves in the middle of the Interceptor Stack könnte, dass beachten Sie:

  • redirect ist das Ergebnis zu verwenden, wenn auf externe URLs umleiten oder Nicht-Aktions-URLs, während redirectAction beim Umleiten zu einer Aktion verwendet werden sollte;
  • Beim Umleiten wird eine neue Anforderung erstellt, und daher gehen die alten Parameter (einschließlich Aktionsfehler und Nachrichten und Feldfehler) verloren.

Um das zu verhindern, wenn Sie die PRG-Muster unter Verwendung (und damit die Umleitung) behalten möchten, können Sie die MessageStore Interceptor verwenden, die die Nachrichten für Sie über die Umleitungen wird speichern und abzurufen; Definieren Sie einfach einen Interceptor-Stack, der es enthält, und es löst Ihr Problem.

Oder tun Sie es einmal wie in the example from the documentation.

+0

Danke für die nützlichen Sachen Andrea. Ich habe ModelDriven aufgegeben und ich habe dies in struts.xml versucht: hinzugefügt in Aktion saveOrUpdateUser, speichert Interceptor mit STORE-Operation und defaultStuck. Dann habe ich den Eingabetyp in redirectAction geändert. Habe ich etwas verpasst? Nach dem Senden eines Formulars mit leerem Namen wird auf die gleiche Seite mit leeren Feldern umgeleitet. Es werden keine Validierungsfehler angezeigt. – manu

+1

'defaultStuck' ist verwirrend amüsant: D –

+1

Übrigens: in struts.xml definiere einen Stack von deinem (myStack) erstellt durch Kopieren des explodierten' defaultStack' (von hier https://struts.apache.org/docs/ struts-defaultxml.html) und fügen Sie den MessageStore-Interceptor hinzu. Verwenden Sie dann default-interceptor-ref, um anzugeben, dass myStack der Standardabfanger für jede Aktion ist, die keinen Stack selbst definiert. Dann setze es auf AUTOMATIC: es wird für jede Weiterleitung funktionieren, wahrscheinlich ohne dir Nachteile zu geben. Falls es immer noch nicht funktioniert, bearbeiten Sie bitte die Frage mit dem aktualisierten Code und wir werden sehen –

1

Dies ist, was Arbeit am Ende tat und nach Andrea nützlichen Kommentaren:

<action name="saveOrUpdatePlayer" method="saveOrUpdate" class="com.test.MyAction"> 

    <interceptor-ref name="store"> 
     <param name="operationMode">STORE</param> 
    </interceptor-ref> 
    <interceptor-ref name="defaultStack" /> 

    <result name="input">/register.jsp</result> 
    <result name="success" type="redirectAction">listUser</result> 
</action> 

Damit werden die Validierungsmeldungen korrekt angezeigt. Als ich redirectAction für input Typ verwendete, verschwanden Nachrichten. Es sieht so aus, als ob defaultStack die Arbeit erledigt hat.

+1

Überprüfen Sie, um Ihre Interzeptoren in der Spitze einzurichten von struts.xml, damit Sie sie nicht für jede Aktion einzeln hinzufügen müssen. – Panos