2

我有一个表单应该创建一个 Load 类型的实体,但由于某种原因,它似乎实际上并没有传递或查看与实体关联(load.user、load.client 等)相关的任何数据)。这一切过去都可以正常工作,但在一堆重构过程中的某个时候停止工作(这并没有改变任何模型中的任何字段)。现在我网站上的所有表格都以同样的方式损坏,我什至不知道从哪里开始修复它。

从视图中,我提交了新加载的表单,一路上我可以在任何地方打印数据。在发送之前打印出正在发送到服务器的数据显示所有数据都像它应该的那样。在控制器中打印Form.form(Load.class).bindFromRequest()显示表单的数据包含所需的所有内容,例如,值user.id=1在数据中。但是,还有一个验证错误,指出用户丢失。怎么会这样?

Form(of=class models.Load, data={ a bunch of stuff, user.id=1, a bunch more stuff}, value=None, errors={=[ValidationError(,Logged in user is missing or invalid.,[])]})

验证错误是public String validate()在 Load 类中生成的,它只是检查if(user==null)并返回该字符串(如果是)。我应该注意,每个提交多个实体的表单(例如,提交一个 Dock 和 Dock 的位置)只保存主要实体(在本例中为 Dock)并忽略所有其他实体(Dock 的位置从未保存,甚至尽管模型中的 Dock 级联也可以保存位置)。我们所有的表单域都被正确标记了,这段代码在它神秘地停止工作之前确实曾经工作过!

那么为什么我的所有表单突然停止正确处理除了表单的主要模型之外的任何内容?就好像他们甚至无法“看到” bindFromRequest() 中包含的数据。如果我在 Load 的验证方法中打印出一个变量,例如 this.status,它会打印出正确的东西。但是,如果我尝试打印 this.user.id 或 this.client.id 之类的内容,则会出现空指针错误。user.id=1Play中实际解释数据(

编辑:另外,是的,我确实尝试过“玩干净”,这是我尝试的第一件事,因为它通常会修复这些奇怪的错误!但这一次,没有骰子。

Edit2:我将表单中的 html 包括在内,以防万一。

<input type="text" id="user_id" name="user.id" value="1" class="idfield">

Edit3:我在重构过程中所做的唯一可能影响这一点的更改是我必须创建一些 setter 方法,例如 Load.setBroker(),因为应该由 Play 生成的那些方法不起作用。比如load.broker=aBroker之前不会设置Load的Broker,所以只好public void setBroker(Broker broker)在Load中做一个方法。Play 是否使用自动生成的设置器来绑定数据?覆盖它们会导致问题吗?

4

1 回答 1

2

哎呀,我想通了。这是我写的二传手。其中一些被错误地设置为私有,显然这阻止了 Play 在绑定数据时设置值。将它们全部更改为公开,神秘错误消失了。

于 2013-07-29T20:24:37.780 回答