我有一个表单应该创建一个Load类型的实体,但由于某种原因,似乎并没有实际传递或看到任何与实体关联相关的数据(load.user,load。客户等)。这一切都过去很好但在一堆重构期间停止了工作(这并没有改变任何模型中的任何字段)。现在我网站上的所有表单都以同样的方式打破了,我也不知道哪里可以开始修复它。
从视图中,我提交了一个新的Load表单,打印出我可以随处可用的数据。在发送之前打印出发送到服务器的数据显示所有数据都应该存在。在控制器中打印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.,[])]})
验证错误由Load类中的public String validate()
生成,它只是检查if(user==null)
并返回该字符串(如果是)。我应该注意,提交多个实体的每个表单(例如,提交Dock以及Dock的位置)仅保存主实体(在此示例中为Dock)并忽略所有其他实体(Dock的位置永远不会保存,甚至虽然模型中的Dock级联也可以保存位置)。我们所有的表单字段都标记正确,这段代码在神秘地停止工作之前曾经在某个时候工作过!
那么为什么我的所有表单突然停止正确处理除表单主模型之外的任何内容?就好像他们甚至无法“看到”bindFromRequest()中包含的数据。如果我在Load的验证方法中打印出一个变量,例如this.status,它会输出正确的东西。但是如果我尝试打印像this.user.id或this.client.id之类的东西,我会得到一个空指针错误。 Play中的代码在哪里实际解释数据(user.id=1
)并将其转换为与负载关联的用户,以及它如何破坏?
编辑:还有,是的,我确实尝试过“玩干净”,这是我尝试过的第一件事,因为它通常会修复像这样的奇怪错误!但这一次,没有骰子。
Edit2:我在表单中包含html,以防它有用。
<input type="text" id="user_id" name="user.id" value="1" class="idfield">
Edit3:我在重构过程中唯一可能影响到的变化是我必须制作一些像Load.setBroker()这样的setter方法,因为那些由Play生成的方法不起作用。例如,load.broker=aBroker
之前不会设置Load的代理,因此我必须在Load中创建public void setBroker(Broker broker)
方法。 Play是否使用自动生成的setter来绑定数据?覆盖它们会导致问题吗?
答案 0 :(得分:2)