2012-04-05 5 views
2

i Überschreibung Validate-Methode haben und hinzugefügt Fehler unter Verwendung addFieldError("test", "test print");Streben 2 Feldfehlerwerte nicht angezeigt

und in JSP verwendet <s:fielderror />

aber die Fehler nicht in input.jsp angezeigt.

Auch ist mein jsp Inhaltstyp <%@ page contentType="text/html; charset=UTF-8"%>

Meine struts.xml wie

  <action name="test" class="ListInfo"> 
       <result>/input.jsp</result> 
      </action> 

    <action name="Proceed" class="Details"> 
    <interceptor-ref name="defaultStack"/> 
      <interceptor-ref name="execAndWait"> 
       <param name="delay">100</param> 
      </interceptor-ref> 
      <result name="wait">Wait.jsp</result> 
     <result name="success">/Summary.jsp</result> 
     <result name="input" type="chain">test</result> 
     <result name="failure" type="chain">test</result> 
    </action> 
+0

können Sie Ihnen jsp Seite zeigen? –

+1

Ich weiß nicht, ob während der Standardverkettung Fehler bei der Aktion aufgetreten sind. Verkettung ist fast immer schlecht, übrigens. –

+0

@DaveNewton: guter Punkt, ich habe es komplett vermisst :) –

Antwort

3

Es stellte sich heraus, dass Fehler (Feld und Aktion sind nicht über eine Kette gehalten.

Nach beweist dies (unterstellt struts2-conventions-plugin-VERSION):

Aktion foo immer kettet an Aktionsleiste (also wir auf ly brauchen

Aktion eine Ansicht für Aktionsleiste) foo

package com.quaternion.action; 

import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.convention.annotation.Result; 

/** #1 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/ 

@Result(name="input", type="chain", location="bar") 
public class Foo extends ActionSupport{ 
    private String name; 

    @Override 
    public void validate(){ 
     super.addActionError("Just an action error"); 
     super.addFieldError("name", "Name is all ways wrong... for no good reason."); 
    } 

    public String getName(){ 
     return name; 
    } 

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

Aktionsleiste

package com.quaternion.action; 

import com.opensymphony.xwork2.ActionSupport; 

/** #2 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/ 

public class Bar extends ActionSupport{ 
} 

Ansicht für Bar: /WEB-INF/content/bar.jsp

<%@taglib prefix="s" uri="/struts-tags"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <body> 
     <h1>Action Bar</h1> 
     <s:actionerror/> 
     <s:fielderror name="name"/> 
    </body> 
</html> 

Testen des oben genannten sehen wir nichts in den Fehlern angezeigt.

Um das Problem zu beheben wir den Laden Abfangjäger verwenden: http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/interceptor/MessageStoreInterceptor.html

In der ersten Aktion (# 1) werden wir Anmerkungen hinzufügen müssen und die Importe um sie zu unterstützen:

import org.apache.struts2.convention.annotation.InterceptorRef; 
import org.apache.struts2.convention.annotation.InterceptorRefs; 

@InterceptorRefs({ 
    @InterceptorRef(value = "store", params = {"operationMode","STORE"}), 
    @InterceptorRef("defaultStack"), 
}) 

In die zweite Aktion (# 2) müssen wir Anmerkungen und die Importe hinzufügen, um sie zu unterstützen:

import org.apache.struts2.convention.annotation.InterceptorRef; 
import org.apache.struts2.convention.annotation.InterceptorRefs; 

@InterceptorRefs({ 
    @InterceptorRef(value = "store", params = {"operationMode","RETRIEVE"}), 
    @InterceptorRef("defaultStack"), 
}) 

Und jetzt ist es wor ks.

+0

HALLO ich änderte meine struts.xml wie folgt ' WIEDER /input.jsp \t \t \t SPEICHER /Summary.jsp test \t \t \t ' aber Es wird richtig umgeleitet, aber es werden immer noch keine Fehler angezeigt. – saket

+0

in Validate-Methode 'addFieldError ("Beschreibung", "Fehler gedruckt werden soll");' in jsp '' – saket

+0

thanx es funktioniert .. Ich versuchte es mit einem einfaches Beispiel .. aber es funktioniert nicht, wenn ich meine header.jsp einschließe. können Sie einen Hinweis, was schief gehen kann .. – saket

2

Wenn Sie sowieso Action-Chaining (die IMO ist fast nie erforderlich, fast nie eine gute Idee, und führt fast immer zu unbeabsichtigten Kopplung zwischen Aktionen), verwenden Sie, was die chaining interceptor bereits bietet und die Konfiguration von etwas daneben "Kette".

sich nach den docs:

  • struts.xwork.chaining.copyErrors - auf true gesetzt Aktion Fehler
  • struts.xwork.chaining.copyFieldErrors zu kopieren - auf true gesetzt Feldfehler
  • struts.xwork.chaining.copyMessages zu kopieren - auf true gesetzt Action-Nachrichten zu kopieren
+0

Ich setze struts.xwork.chaining.copyErrors in meiner Anwendung auf true, und dann, wenn ich einige Fehler durch addActionError() hinzufüge, sucht Struts2 nach "input" anstelle des Ergebnisses, das von der Aktionsmethode zurückgegeben wird. Irgendeine Idee? – Will

+1

@Will Der Standard-Workflow-Interceptor, IIRC, geht bei Fehlern zum Ergebnis "" input "". Das scheint also vom Design her zu funktionieren. (Fairerweise kann ich mich nicht richtig erinnern.) –