在条带actionbean中绑定它时,隐藏字段变为null

时间:2012-04-03 18:43:29

标签: hibernate binding action hidden-field stripes

我有条纹操作页面。当页面加载时,我想通过从一个对象(即setOriginalAssignee(userAction.getAssignee())分配它来保存originalAssignee,这样如果对象的字段受让人被更改,我将进行一些计算。这是我的动作bean:

@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);
    }


}

view-details.jsp页面的一部分看起来像这样

<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>

从我的代码中我可以看到我使用隐藏变量保存originalAssignee ...但是当调用saveUserAction方法时,它表示originalAssignee为null。我不应该弄清楚原因。我应该对转发或重定向解决方案做出改变吗?

仅供参考:userAction是一个休眠持久对象。 谢谢。

3 个答案:

答案 0 :(得分:0)

这是我看到来源时所拥有的

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

但是,当我向隐藏的var添加“value="${actionBean.originalAssignee}"”时,它工作正常。我不知道为什么原始代码不起作用,但至少它解决了问题。

仅供参考:如果你能提供为什么前一个工作不正常而你的解决方案比我的解决方案更好,那么我将为你提供解决方案。所以,随意添加你的答案。

答案 1 :(得分:0)

您的问题在于类型转换/格式化。

在HTTP协议中,数据只能表示为字符串。因此,所有HTML表单值都需要格式化为String值,并且当调用action bean上的setter时,需要进行类型转换。条纹包含type converters / formatters intlongdate等。

但逻辑上Stripes无法知道如何格式化/转换自己的自制类,因此您需要使用具有String值的getter和setter(或任何其他已知类型)并将映射到您自己的类型中。或者您需要通过提供自定义Formatter / TypeConverters扩展Stripes的类型转换/格式化系统并使用@Validate(converter = UserTypeConverter.class)

另请参阅:http://www.stripesframework.org/display/stripes/Binding+Into+Domain+Modelshttp://www.stripesframework.org/display/stripes/Validation+Reference

顺便说一句 Stripersist包还包含一个EntityTypeConverter / EntityFormatter,用于映射您的JPA实体。

答案 2 :(得分:0)

原因是因为Stripes默认输入标记填充策略首先查看请求参数,然后查看ActionBean值:

结帐https://stripesframework.atlassian.net/wiki/display/STRIPES/Tag+Library+Doc  部分输入标签人口和重新种群&#34;

  

DefaultPopulationStrategy按以下顺序搜索   填充给定输入标记时的第一个非空值:

     
      
  1. HttpServletRequest参数映射,用于匹配名称的值   输入标签
  2.   
  3. 属性或嵌套属性的ActionBean
      匹配输入标记的名称
  4.   
  5. 标签
    指定的值   本身(因标记而异;通常作为值属性,或作为正文   标签)
  6.   

您可以使用BeanFirstPopulationStrategy在系统范围内更改此行为。还有一些方法可以将此行为限制为特定的bean:https://stripesframework.atlassian.net/wiki/display/STRIPES/Overriding+PopulationStrategy+per+ActionBean