【问题标题】:Spring - binding to an object rather than a String or primitiveSpring - 绑定到对象而不是字符串或原语
【发布时间】:2010-10-05 17:23:45
【问题描述】:

假设我有以下命令对象:

class BreakfastSelectCommand{
    List<Breakfast> possibleBreakfasts;
    Breakfast selectedBreakfast;
}

如何让春季用列表中的早餐填充“selectedBreakfast”?

我想我会在我的 jsp 中做这样的事情:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast"  />

但这似乎不起作用。有什么想法吗?

谢谢,

-摩根

【问题讨论】:

    标签: spring data-binding spring-mvc


    【解决方案1】:

    这一切的关键是 PropertyEditor。

    您需要为早餐类定义一个 PropertyEditor,然后在控制器的 initBinder 方法中使用 registerCustomEditor 配置 ServletDataBinder。

    示例:

    public class BreakfastPropertyEditor extends PropertyEditorSupport{
        public void setAsText(String incomming){
            Breakfast b = yourDao.findById( Integer.parseInt(incomming));
            setValue(b);
        }
        public String getAsText(){
            return ((Breakfast)getValue()).getId();
        }
    }
    

    请注意,您将需要一些空值检查等,但您明白了。在您的控制器中:

    public BreakfastFooBarController extends SimpleFormController {
        @Override
        protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
            binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao));
        }
    }
    

    注意事项:

    • PropertyEditor 不是线程安全的
    • 如果您需要 Spring Bean,请手动注入它们或在 Spring 中将它们定义为原型作用域并使用方法注入到您的控制器中
    • 如果入站参数无效/未找到,则抛出 IllegalArgumentException,spring 将其正确转换为绑定错误

    希望这会有所帮助。

    编辑(回应评论): 在给定的示例中看起来有点奇怪,因为 BreakfastSelectCommand 看起来不像实体,我不确定您的实际情况是什么。假设它是一个实体,例如带有breakfast 属性的Person,那么formBackingObject() 方法将从PersonDao 加载Person 对象并将其作为命令返回。然后,绑定阶段将根据所选值更改早餐属性,以便到达onSubmit 的命令已全部设置早餐属性。

    根据您的 DAO 对象的实现,调用它们两次或尝试两次加载相同的实体实际上并不意味着您将运行两条 SQL 语句。这尤其适用于 Hibernate,它保证它将返回与给定标识符的会话中相同的对象,因此运行时让绑定尝试加载 Breakfast 选择,即使它没有改变也不应该导致任何不适当的开销。

    【讨论】:

    • 感谢 gid。在绑定时,我的命令对象不是已经创建(第二次)了吗?似乎很奇怪,我需要向 yourDao 提出另一个请求。
    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 2019-08-21
    • 1970-01-01
    • 2012-07-08
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多