当前位置: 首页 > 知识库问答 >
问题:

使用Javax-RS发布复杂的JSON

居星阑
2023-03-14

如果这是重复的,我想提前向您道歉,但是,我在过去的两天里一直在四处寻找,没有找到任何解决我问题的方法。

我已经创建了一个web服务,我想向其发布一个JSON对象。我的问题如下:

假设我有三个对象。

ObjectA:{
"name":"",
"address":"",
"id":""
}

ObjectB:{
"id:"",
"name":"",
"objectA":{ [ObjectA]}
}

ObjectC:{
"id:"",
"name":"",
"objectA":{},
"objectB":{}
}

如您所见,ObjectC引用了ObjectA和ObjectB,它们也引用了ObjectA。插入新ObjectC时,ObjectC. ObjtA应该与ObjectC. ObjtB. ObjtA相同。

POST由以下方法使用:

@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(ObjectC entity) {        
            super.create(entity);
}

这些类如下所示:(加上getter和setter)

@Entity
@Table(name = "object_a")
public class ObjectA{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @NotNull
    @Column(name = "u_name")
    private String uName;

    @Column(name = "address")    
    private String address;
}

@Entity
@Table(name = "object_b")
public class ObjectB{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @JoinColumn(name = "object_a", referencedColumnName = "id")
    @ManyToOne(optional = false, cascade = CascadeType.PERSIST)
    @Valid
    private ObjectA objectA;
}

@Entity
@Table(name = "object_c")
public class ObjectC{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @JoinColumn(name = "object_a", referencedColumnName = "id")
    @ManyToOne(optional = false, cascade = CascadeType.PERSIST)
    @Valid
    private ObjectA objectA;

    @JoinColumn(name = "object_b", referencedColumnName = "id")
    @ManyToOne(optional = false, cascade = CascadeType.PERSIST)
    @Valid
    private ObjectB objectB;

}

注意:我可以发布一个ObjectA和一个ObjectB而没有任何问题。

问题是ObjectC。objectA和ObjectC。对象B。objectA正在作为不同的值插入(或尝试插入),这会引发异常,因为objectA。uName是唯一的。如果不是这样的话,就会创建两个新的ObjectA。

我在Hibernate中通过执行以下操作解决了这个问题:

ObjectA a = new ObjectA();
ObjectB b = new ObjectB();
ObjectC c = new ObjectC();

b.setObjectA(a);
c.setObjectA(a);
c.setObjectB(b);

session.beginTransaction();
session.save(a);
session.save(b);
session.save(c);
session.getTransaction().commit();

我该怎么办?

共有1个答案

祁辰阳
2023-03-14

对于任何可能遇到这个问题的人,我已经找到了解决方案。

我用一种非常类似于我在hibernate中所做的方式(见上文)。

我将上面发布的创建方法编辑为:

@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(ObjectC entity) {

    if(entity.getObjectA().getId()==null){//If objectA doesn't have an ID, it must be new

            entity.getObjectB().setObjectA(entity.getObjectA());
            em.persist(entity.getObjectA());
            em.persist(entity.getObjectB());
            em.persist(entity);     


    }else{//Otherwise, everything may be inserted at once.
        super.create(entity);        
    }

}

顺便说一下,super.create(实体)方法包含以下内容:

public void create(T entity){            
        getEntityManager().persist(entity);       

}
 类似资料:
  • 使用放心,我们可以轻松执行GET,POST和其他方法。在下面的示例中,我们将 POST 发送到返回 JSON 响应的 API。 但是我需要创建具有复杂XML正文的POST请求。正文示例: 我该怎么做?提前感谢您

  • 作者:徐飞 在dva的官方仓库里,提供了上手教程,讲述了dva的一些基本概念。到了真实的业务开发过程中,会遇到许许多多不能用那些基本操作覆盖的场景,本文尝试列举一些常见的需求在dva中的实现方式。 动态加载model 有不少业务场景下,我们可能会定义出很多个model,但并不需要在应用启动的时候就全部加载,比较典型的是各类管理控制台。如果每个功能页面是通过路由切换,互相之间没有关系的话,通常会使用

  • 我正在尝试使用Retrofit2和静态编程语言发送一个复杂对象作为我请求的参数。该对象的结构如下: 列表字段的数量是不同的(可以是2个列表,也可以是10个)以及每个列表中的项目数量。我正在使用以下代码来实现这一点,之前用适当的值填充了我的Map: 由于某种原因,这种方法无法正常工作,服务器只是忽略了我的参数。我还尝试将它们作为string/ject发送,但服务器似乎只接受FormUrlEncode

  • 问题内容: 我当前的代码如下所示。如何将数组传递给控制器​​,控制器动作必须接受哪种参数? 我的控制器动作方法看起来像 问题答案: 我找到了解决方案。我使用了Steve Gentile,jQuery和ASP.NETMVC的解决方案-将JSON发送到Action-Revisited。 我的ASP.NET MVC视图代码如下所示: 并且我的控制器动作装饰有一个自定义属性 可在此处找到自定义属性的代码(

  • 问题内容: 但是解决方案似乎不适合我的问题。 这是我的HTML。行数是可变的: JS构建一个对象数组并将其发布到控制方法中: 每行代表一个WorkPlanItem。 我的目标是将它们全部发布到我的控制器以更新它们。 我似乎无法弄清楚如何在控制器方法(AjaxUpdate)中访问数组。 问题答案: 您可以按Vikas发布的方式对表格进行序列化,或者,如果您希望遍历页面(如当前操作)并使用数组,可以使

  • 问题内容: 我有办法 现在我知道我可以将一个对象以json格式发布,只需将其放入正文即可。但是可以做多个对象吗?如果是这样,怎么办? 问题答案: 答案是否定的。 原因很简单:这与您可以在方法中接收的参数有关。它们必须与请求相关。对?因此,它们必须是标题或cookie或查询参数或矩阵参数或路径参数或请求正文。(仅是为了讲述完整的故事,还有其他类型的参数称为上下文)。 现在,当您在请求中收到JSON对