加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Spring – 绑定到对象而不是String或primitive

发布时间:2020-12-15 01:42:05 所属栏目:大数据 来源:网络整理
导读:假设我有以下命令对象: class BreakfastSelectCommand{ List 如何从名单中选择含早餐的“selectedBreakfast”? 我在想我在jsp中做这样的事情: 但这似乎不起作用.有任何想法吗? 谢谢, -摩根 最佳答案 所有这一切的关键是PropertyEditor. 您需要为Breakfas

假设我有以下命令对象:

class BreakfastSelectCommand{
    List

如何从名单中选择含早餐的“selectedBreakfast”?

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

但这似乎不起作用.有任何想法吗?

谢谢,

-摩根

最佳答案
所有这一切的关键是PropertyEditor.

您需要为Breakfast类定义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不是线程安全的
>如果您需要弹簧豆,可以手动注射它们,也可以在弹簧中将它们定义为原型范围,并使用方法注入控制器
>如果入站参数无效/未找到,则抛出IllegalArgumentException,spring会将此转换为绑定错误

希望这可以帮助.

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

根据您的DAO对象的实现调用它们两次或尝试两次加载相同的实体并不意味着您将获得两个运行的SQL语句.这特别适用于Hibernate,它保证它将返回给定标识符在其会话中的同一对象,因此运行允许绑定尝试加载Breakfast选项,即使它没有改变也不会导致任何过度开销.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读