将模型的子属性设置为null背后的规则是什么?

时间:2015-12-21 16:30:21

标签: java spring spring-mvc

在我的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中的不同表单字段类型,看起来有不同的规则。

有没有人遇到类似的问题?

1 个答案:

答案 0 :(得分:0)

DataBinder有两个名为allowedFieldsdisallowedFields的属性,您可以定义要绑定的内容。在执行控制器方法之前,只需将其与注释@InitBinder一起使用:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields("uuid");
}