在我的Spring MVC / Thymeleaf应用程序中,我在实例化任何模型实体的全新实例时应用UUID(我在每个实体扩展的AbstractModel中执行)。然后我使用它来实现沿所有实体传播的自定义等于方法实现
@Column(name = "UUID", nullable = false, unique = true)
private String uuid = IdGenerator.createId();
我在其他地方创建了一个表单bean(简单包装器),其中包含这些新创建的实体的图形。
示例包装器如下所示:
WrapperObj obj = new Obj(new FooEntity(), new BarEntity())
FooEntity和BarEntity都有一些文件,比如最初未设置的整数,字符串等。设置的唯一文件结构是UUID
然后我将包装器传递给我最终填满空字段的表单。
当我提交表单并且实体未被修改时,它们仍然存在于包装器中。当我附加另一个对象时,最初设置没有UUID的包装器WrapperObj obj = new Obj(new FooEntity(), new BarEntity(), new TestObj())
并在不更改其字段的情况下提交表单,TestObj将重置为null。
这是我对其他启用UUID的实体所希望的行为。
如何指示spring mvc框架在绑定时忽略UUID字段,以便实体在未修改时也变为null?
感谢您的帮助!
CORRECTION
TestObj对象未绑定到表单中的任何输入字段。
更新
我刚刚发现导致问题的不是uuid。我的包装器我有另一个子实体,让我们说BoolFoo只有布尔字段(除了由AbstractEntity类设置的id(int)和uuid(字符串))。 这些字段是表单中的类型复选框。 当我在不修改任何BoolFoo文件的情况下提交表单时,BoolFoo作为一个整体被设置为null(尽管在将对象传递给表单时存在id和uuid)。
但是,如果为任何子实体提供了至少一个文本字段(未针对其他类型进行检查),则从表单返回时,子对象(或任何实际对象)将永远不会为空。
我已经尝试了binder.setDisallowedFields("uuid")
方法以及binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
,但无论我做什么,未修改的对象都不会设置为null。
对于spring mvc中的不同表单字段类型,看起来有不同的规则。
有没有人遇到类似的问题?
答案 0 :(得分:0)
DataBinder
有两个名为allowedFields
和disallowedFields
的属性,您可以定义要绑定的内容。在执行控制器方法之前,只需将其与注释@InitBinder
一起使用:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("uuid");
}