2013-01-25 69 views
0

我有此课程:@ModelAttribute具有Collection属性 - 值被添加到集合中,而不是被替换?

PreApprovalRequest类的属性为headings,该属性在控制器中自动填充(请参阅页面上较低的Controller代码)。

public class PreApprovalRequest { 
    private Long id; 
    private String Description; 
    private Collection<Headings> headings; //this property! 
} 

而且控制器:

@Controller 
@SessionAttributes({"preApprovalRequest", "productRecommendations"}) 
public class RequestController { 

    @RequestMapping(value = "/submit", method = RequestMethod.POST) 
    public String submitResults(@ModelAttribute(value = "preApprovalRequest") @Valid PreApprovalRequest preApprovalRequest, BindingResult errors) { 
     //HERE: It looks like if I have some headings in the preApprovalRequest object already, the call of this method will not delete those, but will append to the existing list. 
     //save object in DB. 
     return "dashboard"; 
    } 
} 

任何想法如何使弹簧更换集合对象,而不是增加呢?

+0

这是SessionAttributes持有相同'preApprovalRequest'变量的预期行为。如果您不想从提交的内容中创建新的标题,只需将其从“SessionAttributes”中删除即可。 –

+0

我每次都需要新的标题。这是问题,我不明白。 Spring似乎只是添加到标题列表中,而不是删除旧标题,只保留新标题。我不知道为什么会有人想要这样做,不明白为什么他们在Spring中像那样实现它?! – Stef

回答

0

我怎么理解你的问题是,你不能取代你的headings集合有一个新的集合Headings。你不能以下面的方式做到这一点吗?

preApprovalRequest.setHeadings(new ArrayList<Headings>()); 
preApprovalRequest.getHeadings().add(heading1); 
+0

是的,你理解正确。我希望Spring删除旧列表并将新列表放入对象中。不,这不会起作用,因为标题的设置是由Spring自动完成的,所以当我开始做任何事情时,Spring已经将新标题添加到旧列表中。因此,我不会知道哪些是新的标题,哪些是旧的... – Stef

0

即使这是您第一次提交表单时是否发生这种情况?如果没有,请在完成控制器中的所有操作后尝试清理缓存。

在您的方法中添加SessionStatus并调用“setComplete()”来清除属性。因此,您启动过程中的第二次,您的缓存将是空的,你将不得不使用新preApprovalRequest

@RequestMapping(value = "/submit", method = RequestMethod.POST) 
public String submitResults(@ModelAttribute(value = "preApprovalRequest") @Valid PreApprovalRequest preApprovalRequest, BindingResult errors, SessionStatus status) { 
    /HERE: It looks like if I have some headings in the preApprovalRequest object already, the call of this method will not delete those, but will append to the existing list. 
    //save object in DB. 

    status.setComplete(); 
    return "dashboard"; 
} 
+0

是的,它一直在发生。当我设置标题时,我无法完成会话,“向导”尚未完成。一旦PreApprovalRequest被保存在数据库中,我会这样做,稍后再向导一个步骤。 – Stef

0

如果你正在寻找的是动态收缩/扩展类型的列表,然后收集有是lazy.Apache公共收藏提供了一个懒列表类不that.You可以得到阿帕奇百科全书集合:http://commons.apache.org/collections/

所以控制器型号可以被重新写为:

public class PreApprovalRequest { 
    private Long id; 
    private String Description; 
    private List headings; 

    public PreApprovalRequest() 
    { 
     headings=LazyList.decorate(
      new ArrayList(), 
      FactoryUtils.instantiateFactory(Header.class)); 
    } 

} 

背后的思想结合数据列出使用html元素名称属性跟踪列表项索引:

<c:forEach item="${modelAttr.list}" varStatus="listItem"> 

<form:input type="text" path="list[${listItem.index}]" /> 

</c:forEach> 
+0

谢谢,但不,这不是我正在寻找的。我只希望Spring不会将新标题添加到会话对象中已有的列表中,而是用新提交的标题替换旧标题。 – Stef

相关问题