gpt4 book ai didi

Spring - 绑定(bind)到对象而不是字符串或基元

转载 作者:行者123 更新时间:2023-12-02 17:27:46 24 4
gpt4 key购买 nike

假设我有以下命令对象:

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

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

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

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

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

谢谢

-摩根

最佳答案

这一切的关键是 PropertyEditor。

您需要为 Breakfast 类定义一个 PropertyEditor,然后在 Controller 的 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();
}
}

请注意,您将需要一些空检查等,但您明白了。在你的 Controller 中:

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

需要注意的事项:

  • PropertyEditor 不是线程安全的
  • 如果您需要 spring bean,请手动注入(inject)它们或在 spring 中将它们定义为原型(prototype)范围并使用方法注入(inject)到 Controller 中
  • 如果入站参数无效/未找到,则抛出 IllegalArgumentException,spring 会正确将其转换为绑定(bind)错误

希望这有帮助。

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

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

关于Spring - 绑定(bind)到对象而不是字符串或基元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/516670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com