如何通过RestTemplate发布一个包含嵌入式成员的类?

时间:2017-01-24 21:29:43

标签: json spring-data-jpa repository-pattern crud resttemplate

我有一个有几个成员的班级,以及相关的制定者和吸气者:

public class Tester implements Serializable {
  @Column(name="ID", nullable=false, unique=true)   
  @Id   
  @GeneratedValue(generator="LOCATION_FACILITYTYPE_ID_GENERATOR")   
  @org.hibernate.annotations.GenericGenerator(name="LOCATION_FACILITYTYPE_ID_GENERATOR", strategy="native") 
  private int ID;

  @Column(name="Value", nullable=false, unique=true, length=4)  
  private String value;

  @Column(name="Name", nullable=false, unique=true, length=8)   
  private String name;

  @ManyToOne(targetEntity=location.FacilityType.class, fetch=FetchType.LAZY)    
  @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK})  
  @JoinColumns({ @JoinColumn(name="FacilityTypeID", referencedColumnName="ID", nullable=false) })   
  private location.FacilityType facility;

在JUnit中,我试图测试创建一个Tester元素:

    Tester trythis = new Tester();
    trythis.setName("Herewe");
    trythis.setValue("wow1");
    Tester jnode = restTemplate.postForObject(TestBase.URL + "tester/", trythis, Tester.class);

这可以按预期工作。但是,如果我使用这样的代码来包含嵌入式成员:

    FacilityType ft = new FacilityType();       
    ft.setValue("AL");
    ft.setName("2adamlec");
    Tester trythis = new Tester();
    trythis.setName("Herewe");
    trythis.setValue("wow1");
    trythis.setFacility(ft);
    Tester jnode = restTemplate.postForObject(TestBase.URL + "tester/", trythis, Tester.class);

其中具有值= AL的嵌入式成员尚未出现在数据库中,我仍然在Tester表中创建了一个新行...但是Tester中的值和名称列都填充了值(AL和2adamlec )为FacilityType定义。

请注意,我们正在使用FacilityType和Tester的JPARepository框架。 CRUD函数因此在“封面”下处理,我无法调试POST处理。我想知道这是否与以下事实有关:TET数据的GET只会返回JSON回复中的原始字段,因为没有为FacilityType定义投影。

我是否做错了导致FacilityType字段被保存以代替Tester表中所需的Tester字段?

1 个答案:

答案 0 :(得分:0)

简短回答:在创建项目时,您必须以服务器期望的相同JSON格式提供数据。如果您有嵌入式类,则必须创建一个类,其中工具成员是用于容纳URL的String,然后将该成员设置为与嵌入类的现有实例对应的URL。在接收端,您还需要一个像这样的新类:

public class FMT_Tester_RCV {
  public FMT_Tester_RCV() { }

  private String value;
  private String name;
  private Integer id;
  private Integer ormid;
  private JsonNode _links;

您可以沿着JsonNode向下移动以获取嵌入式类实例的链接。