【问题标题】:Spring Form: select bean according to paramsSpring Form:根据参数选择bean
【发布时间】:2015-08-15 01:37:51
【问题描述】:

我有一个关于 Spring 表单的问题(具体来说是 Thymeleaf)。
我知道我一次只能使用一个 bean 来支持 Spring 中的表单,所以我认为让 Controller 选择应该绑定到表单的 bean 会很好,具体取决于发送的参数。但是,我没有为每个新参数编写一个新的 RequestMapping,而是想知道是否可以以某种方式仅将参数映射到 ModelAttribute 本身。

我想到了这样的事情:

@Controller
public class FormController{

@ModelAttribute("bean", params={"type=bean1"}) //this declaration is invalid
public IBean loadEmptyModelBean(){
    return new Bean1();
}
@ModelAttribute("bean", params={"type=bean2"})
public IBean loadEmptyModelBean(){
    return new Bean2();
}

//..

@RequestMapping(method=RequestMethod.GET)
public String showForm(IBean bean){     
    //..
}

@RequestMapping(method=RequestMethod.POST, params={"validate"})
public String validate(@Valid IBean bean, BindingResult result){
    List<ObjectError> errors = bean.validate();
    for(ObjectError e: errors){
        result.addError(e);
    }

    //redirecting, etc
}

}

如您所见,我将根据参数实例化不同的 Bean,并且仍然对每个 GET 和 POST 过程仅使用一种方法,因为 IBean 将是一个强制所有 Bean 实现 validate() 方法的接口。

我几天前才开始使用 Spring,想知道是否有人知道解决此问题的方法,谁比我更有经验 :)
我搜索了答案,但找不到针对我的具体问题的解决方案。我想,我可以实现很多由参数过滤的处理程序,但这将是非常多余的,因为每个方法都必须执行相同的操作(调用 validate() 方法并将新错误添加到 BindingResult)。 ..我认为这不是一个好的解决方案,tbh。
希望我的问题听起来不傻^^

提前感谢您的时间和精力。

【问题讨论】:

    标签: java forms validation spring-mvc modelattribute


    【解决方案1】:

    Spring 的方法是使用不同的 @RequestMapping 注释方法调用私有方法来完成这项工作

    @RequestMapping(method=RequestMethod.POST, params={"validate", "type=bean1"})
    public String validate1(@Valid Bean1 bean, BindingResult result){
        return doValidate(bean, result);
    }
    @RequestMapping(method=RequestMethod.POST, params={"validate", "type=bean2"})
    public String validate2(@Valid Bean2 bean, BindingResult result){
        return doValidate(bean, result);
    }
    private String doValidate(IBean bean, BindingResult result){
        List<ObjectError> errors = bean.validate();
        for(ObjectError e: errors){
            result.addError(e);
        }
    
        //redirecting, etc
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多