2012-04-03 19 views
2

Ich habe eine Streifenaktionsseite. Wenn die Seite geladen wird, möchte ich einen OriginalAssignee speichern, indem ich ihn einem Objekt zuweise (d. h. setOriginalAssignee (userAction.getAssignee())), so dass im Falle einer Änderung des Feld-Beauftragten des Objekts eine Berechnung durchgeführt wird. Hier ist meine Aktion Bohne:Verstecktes Feld wird Null, wenn es in Streifen actionbean

@UrlBinding("/action/view-details.page") 
public class ActionListViewPage extends CustomAction { 
. 
. 
. 
private static final String ACTION_LIST_VIEW = "/action/view-details.jsp"; 
private static final String ACTION_HOME_PAGE="/action/dashboard.page"; 
private SecurityPerson originalAssignee; 
private UserAction userAction; 

    public UserAction getUserAction() { 
     return userAction; 
    } 

    public void setUserAction(UserAction userAction) { 
     this.userAction = userAction; 
    } 

    public SecurityPerson getOriginalAssignee() { 
     return originalAssignee; 
    } 

    public void setOriginalAssignee(SecurityPerson originalAssignee) { 
     this.originalAssignee = originalAssignee; 
    } 

@DefaultHandler 
    public Resolution showUserAction() { 


     if(userAction==null){ 
      flash("error", "Can't find the the specified User action."); 
      return new RedirectResolution(ACTION_HOME_PAGE); 
     } 

     setOriginalAssignee(userAction.getAssignee());// This one works fine and assigns the the assignee to originalAssignee for future reference 
     return new ForwardResolution(ACTION_LIST_VIEW); 
    } 
public Resolution saveUserAction() { 

     try { 

      if(!originalAssignee.equals(userAction.getAssignee())){ 
       userAction.setStatusEnum(StatusEnum.RE_ASSIGNED); 
       userAction.setAssignedBy(getCurrentUser(getRequest())); 
       userAction.setAssignedTimestamp(new Date()); 
      } 

      if (userAction.getStatusEnum() == null) { 
       userAction.setStatusEnum(FinAidActionStatusEnum.UNASSIGNED); 
      } 


      userAction.save(); 
      flash("ok", "User Action change has been saved to the database. "); 

     } 
     catch (Exception e) { 

      flash("error", "Error saving UserAction./n " + e.getMessage()); 
     } 
     return new RedirectResolution(ACTION_HOME_PAGE); 
    } 


} 

Teil der Ansicht-details.jsp Seite sieht wie folgt aus

<stripes:form beanclass="${actionBean.class}" name="actionListForm" id="actionListForm" method="POST" 
           action="view-details.page?saveUserAction=1" 
           style="padding-left:20px;"> 
        **<stripes:hidden name="originalAssignee"/>** 

        <tr> 
         <td align="left"> Assign to:</td> 

         <td align="right"> 
          <stripes:select name="userAction.assignee" value="${actionBean.userAction.assignee}" 
              onchange="$('actionListForm').submit();"> 
           <stripes:option value=""> </stripes:option> 
           <stripes:options-collection collection="${actionBean.assigneeList}" 
                  label="person.name"/> 
          </stripes:select> 
         </td> 
         </br> </br> 
        </tr> 
        <tr> 
         <td> 
          Status: 
         </td> 
         <td> 
          <stripes:select name="userAction.statusEnum" onchange="$('actionListForm').submit();" 
              value="${actionBean.userAction.statusEnum}"> 
           <stripes:option value=""> </stripes:option> 
           <stripes:options-enumeration enum="uiowa.maui.biz.finaid.enums.FinAidActionStatusEnum"/> 
          </stripes:select> 
         </td> 

        </tr> 

        <stripes:hidden name="userAction"/> 


       </stripes:form> 

Wie Sie aus meinem Code sehen kann ich versteckte Variable verwendet originalAssignee zu halten ... aber Wenn die saveUserAction-Methode aufgerufen wird, wird der OriginalAssignee als null angegeben. Ich sollte den Grund nicht herausfinden. Gibt es eine Änderung, die ich an der Forward- oder Redirect-Auflösung vornehmen sollte?

FYI: userAction ist ein permanentes Ruhezustandsobjekt. Danke. Diese

+0

Haben Sie überprüft, dass das ausgeblendete Feld ordnungsgemäß in dem Formular festgelegt wird? Entweder die Quelle betrachten oder sie in ein Textfeld umwandeln? – clmarquart

+0

Das ist, was ich habe, wenn ich die Quelle sehe Allerdings, wenn ich "value =" $ {actionBean.originalAssignee} "" zu den versteckten var .. und es hat gut funktioniert. Ich weiß nicht, warum der ursprüngliche Code nicht funktioniert, aber zumindest jetzt hat es das Problem gelöst. – WowBow

Antwort

0

ist das, was ich habe, wenn ich die Quelle sehen

<input type="hidden" value="" name="originalAssignee"> 

Allerdings, wenn ich „value="${actionBean.originalAssignee}"“, um die versteckten var hinzufügen .. und es hat gut funktioniert. Ich weiß nicht, warum der ursprüngliche Code nicht funktioniert, aber zumindest jetzt hat es das Problem gelöst.

FYI: Wenn Sie bieten können, warum der vorherige nicht funktioniert und Ihre Lösung besser ist als meine, werde ich Ihre Lösung machen. Also, zögern Sie nicht, Ihre Antwort hinzuzufügen.

0

Ihr Problem ist mit der Typkonvertierung/Formatierung.

Innerhalb des HTTP-Protokolls können Daten nur als Strings dargestellt werden. Daher müssen alle HTML-Formularwerte als String-Werte formatiert werden, und wenn der Setter der Action-Bean aufgerufen wird, ist eine Typkonvertierung erforderlich. Out of the box Stripes hat type converters/formatters für int, long, date usw.

Aber logisch Streifen können nicht wissen, wie Sie Ihre eigenen selbst gemacht Klassen zu formatieren/konvertieren, so müssen Sie entweder Getter und Setter mit String-Werten verwenden, (oder jeden anderen bereits bekannten Typ) und die Zuordnung zu Ihren eigenen Typen selbst vornehmen. Oder Sie müssen die Art Konvertierung/Formatierung System von Streifen erweitern, indem benutzerdefinierte Formatter/Typeconverter Bereitstellung und verwenden Sie den @Validate (Konverter = UserTypeConverter.class)

Siehe auch: http://www.stripesframework.org/display/stripes/Binding+Into+Domain+Models und http://www.stripesframework.org/display/stripes/Validation+Reference

BTW Stripersist Pakete auch enthält eine EntityTypeConverter/EntityFormatter, die Ihre JPA-Entitäten zuordnen wird.

+0

Vielen Dank für Ihre Antwort. Zuallererst habe ich bereits Setter und Getter-Methoden für originalAssignee. Und zweitens verwenden wir jede Art von Objekten außer String und sie funktionieren gut. Wie Sie sehen können, hat userAction Getter- und Setter-Methoden und sein Typ ist nicht String, aber es funktioniert gut. – WowBow

+1

Ich habe meine Antwort aktualisiert, hoffe, dass sie Ihnen hilft, Ihr Problem zu finden. – Kdeveloper

0

Die Gründe dafür sind, weil Stripes Standardeingabe Tag Bevölkerungs Strategie zunächst auf Anfrage Parameter sieht und dann an dem ActionBean Wert:

Check out https://stripesframework.atlassian.net/wiki/display/STRIPES/Tag+Library+Doc Abschnitt Eingabe Tag Bevölkerung und Repopulation“

Die DefaultPopulationStrategy Suche in der folgenden Reihenfolge für die ersten Nicht-Null-Wert (e) beim Auffüllen eines bestimmten Eingabe-Tags:

  1. Die HttpServletRequest Parameterkarte für Werte den Namen des Eingang tag
  2. Die ActionBean für eine Eigenschaft oder nested Eigenschaft
    passend den Namen des Eingangs-Tages
  3. Der angegebene Wert durch den Tag
    selbst (variiert passende nach dem Tag; in der Regel als ein Wert Attribut, oder wie der Körper des Tags)

Sie dieses Verhalten systemweit unter Verwendung des BeanFirstPopulationStrategy ändern können. Es gibt auch Möglichkeiten, dieses Verhalten auf eine bestimmte Bean zu beschränken: https://stripesframework.atlassian.net/wiki/display/STRIPES/Overriding+PopulationStrategy+per+ActionBean