为啥我的嵌套 POJO 从 Play 中的表单返回 null! 1.x

Posted

技术标签:

【中文标题】为啥我的嵌套 POJO 从 Play 中的表单返回 null! 1.x【英文标题】:Why does my nested POJO return null from a form in Play! 1.x为什么我的嵌套 POJO 从 Play 中的表单返回 null! 1.x 【发布时间】:2018-12-04 10:01:13 【问题描述】:

在游戏中!框架 1.5.1,为什么我会为 thingy.Owner 获得空值?自动绑定不应该解决这个问题吗?

用户类

    package models;

@Entity
@Table(name="objtest_user")
public class User extends Model

    @Required
    public String username;

    @Password
    @Required
    public String password;

    public String fullname;

    public User(String username, String password, String fullname)
    
        this.username = username;
        this.password = password;
        this.fullname = fullname;
    

    @Override
    public String toString()
    
        return this.fullname;
    

还有这个引用 User 类的 Thingy 类

    package models;

import java.util.*;
import javax.persistence.*;

import play.db.jpa.*;
import play.data.validation.*;

@Entity
public class Thingy extends Model

    @Required
    public String Name;

    @ManyToOne
    public User Owner;

    public Thingy(String name, User owner)
    
        this.Name = name;
        this.Owner = owner;
    

    @Override
    public String toString()
    
        return Name;
    

还有这个模板表格

#extends 'main.html' /
#set title:'Home' /

<p>Current user = $currentUser</p>


#form @saveThingy(), id:'saveThingy'
    <input type="text" id="thingy.Name" name="thingy.Name"/>
    <input type="hidden" id="thingy.Owner" name="thingy.Owner" value="$currentUser"/>
    <input type="submit" id="Save" value="Save"/>
#/form

控制器方法

public static void saveThingy(Thingy thingy)

    System.out.println("Name = " + thingy.Name);
    System.out.println("Owner = " + thingy.Owner);

    thingy.save();

【问题讨论】:

哦,根据我在表单上的测试渲染,currentUser 已正确填充。要设置的代码是 public static void index() User currentUser = User.findById(1L); System.out.println("控制器当前用户" + currentUser); renderArgs.put("currentUser", currentUser);使成为(); 【参考方案1】:

尝试更改以下行

<input type="hidden" id="thingy.Owner" name="thingy.Owner" value="$currentUser"/>

<input type="hidden" id="thingy.Owner" name="thingy.Owner.id" value="$currentUser.id"/>

如果您查看文档 (https://www.playframework.com/documentation/1.2.x/controllers#params) 并查找 JPA 对象绑定部分,它谈到了要求子对象具有 id。当它找到一个对象的 ID 时播放,它将通过 JPA/Hibernate 加载相关实体。

【讨论】:

是的,这行得通 - 非常感谢。几乎每场比赛!我曾经问过的问题已经被你解决了。图例。

以上是关于为啥我的嵌套 POJO 从 Play 中的表单返回 null! 1.x的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Play 框架中的 YAML 固定装置加载(静态嵌套)枚举值?

@RequestParam 从邮递员的表单数据中传递 Spring Boot 中的 pojo 字段

In Play 2.4.0 如何在嵌套表单的多字段约束中命名字段?

为啥我的 graphql 嵌套查询返回 null?

我的 fetch 请求返回的数据不在我的数据库中,为啥?

嵌套表单中的链接返回无效关联