2015-12-21 27 views
0

在我的Spring MVC/Thymeleaf应用程序中,当实例化任何模型实体的全新实例(我在AbstractModel中实现每个实体扩展时)时应用UUID。我用它,然后进行自定义等于沿所有实体将模型的子属性设置为null的规则是什么?

@Column(name = "UUID", nullable = false, unique = true) 
    private String uuid = IdGenerator.createId(); 

传播方法实现我一些其他的地方,我创建一个包含这种新创建实体的图形的形式豆(简单包装)。

为例包装应该是这样的:

WrapperObj obj = new Obj(new FooEntity(), new BarEntity()) 

两个FooEntity和BarEntity有一定的Fileds喜欢整数,字符串等,它们最初未设置。唯一的fileld是UUID

然后我将包装传递给最终填充空字段的表单。

当我提交表单并且实体未被修改时,它们仍然存在于包装中。当我附加另一个对象时,没有UUID的包装器WrapperObj obj = new Obj(new FooEntity(), new BarEntity(), new TestObj())最初设置并提交表单而不更改它的字段,TestObj被重置为空。

这是我对其他支持UUID的实体所需的行为。

如何指示spring mvc框架在绑定时忽略UUID字段,以便在未修改时实体也变为null?

感谢您的帮助!

CORRECTION

的TestObj对象没有绑定到任何形式输入字段。

UPDATE

我刚刚发现,这不是引起该问题的uuid。我包装我有另一个子实体,让我们说BoolFoo只有布尔字段(由AbstractEntity类设置id(int)和uuid(字符串)的一部分)。 这些字段是表单中的复选框类型。 当我在不修改任何BoolFoo的文件的情况下提交表单时,BoolFoo作为一个整体被设置为null(尽管在将对象传递给表单时存在id和uuid)。

但是,如果为任何子实体提供至少一个文本字段(未针对其他类型进行检查),则在从表单返回时,子对象(或任何实际的)永远不会为空。 我已经尝试过binder.setDisallowedFields("uuid")方法以及binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));,但无论我做什么,未修改的对象都不会设置为null。

看起来在春季mvc中有不同的表单字段类型有不同的规则。

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

+0

请仔细阅读[问] –

回答

0

DataBinder有两个属性,名为allowedFieldsdisallowedFields,您可以定义要绑定或不绑定。只要使用与执行控制方法之前注释@InitBinder

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

根据最新的API文档: '注册,不应该允许绑定字段。缺省值是none。将域标记为不允许,以避免恶意用户在绑定HTTP请求参数时进行不必要的修改。' 我实际上并没有通过任何表单字段绑定uuid,它只是作为包装器中每个实体的一部分传递给表单。在更新中,我描述了我的最新观察结果。 – mooor

相关问题