Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在同一服务中解组不同对象_Java_Ajax_Json_Jersey_Marshalling - Fatal编程技术网

Java 在同一服务中解组不同对象

Java 在同一服务中解组不同对象,java,ajax,json,jersey,marshalling,Java,Ajax,Json,Jersey,Marshalling,我试图找到一种方法来创建一个服务,该服务将接收不同的对象类型(如JSON)并正确地解组它们。到目前为止,我能够使用自定义反序列化器和google的gson库实现单个或列表对象的解组,但这确实是一个限制。我可以使用它创建的服务的唯一类型只能有单一类型的对象作为参数,如下所示: @GET @Path("myService") @Consumes(MediaType.APPLICATION_JSON) public Response myService(MyEntity entity) { /

我试图找到一种方法来创建一个服务,该服务将接收不同的对象类型(如JSON)并正确地解组它们。到目前为止,我能够使用自定义反序列化器和google的
gson
库实现单个或列表对象的解组,但这确实是一个限制。我可以使用它创建的服务的唯一类型只能有单一类型的对象作为参数,如下所示:

@GET
@Path("myService")
@Consumes(MediaType.APPLICATION_JSON)
public Response myService(MyEntity entity) {
    //Random stuff using entity
    return Response.ok().build();
}
但是,我正在尝试创建这样的服务:

@GET
@Path("advancedService")
@Consumes(MediaType.APPLICATION_JSON)
public Response advancedService(MyEntity1 entity1, MyEntity2 entity2, @QueryParam("normalParam") int normalParam, @QueryParam("normalBoolean") boolean normalBoolean) {
    //Do stuff using both entity1 and entity2.
    return Response.ok().build();
}
现在,当我通过ajax请求发送JSON时,为了让服务理解对象结构,它的格式必须如下所示:

$.ajax({
    url: 'services/MyServices/myService',
    type: 'GET',
    data: JSON.stringify(myEntityObjectStructure),
    contentType: 'application/json; charset=UTF-8',
    dataType: 'json',
    success: function (result, status, xhr) {
      //blahblah
    }
  });
数据
配置中,它只需要读取对象结构,否则会混淆。我正在尝试发送这样的请求:

$.ajax({
    url: 'services/MyServices/myService',
    type: 'GET',
    data: {
        myEntity1: JSON.stringify(myEntity1ObjectStructure),
        myEntity2: JSON.stringify(myEntity2ObjectStructure),
        normalParam: param1,
        booleanParam: param2
    },
    contentType: 'application/json; charset=UTF-8',
    dataType: 'json',
    success: function (result, status, xhr) {
      //blahblah
    }
  });
但它只是不读取参数名,而且它被卡住了,因为它认为必须将所有
数据
结构解组为单个对象

我用的是泽西2.19。此外,我正在寻找一个正常的解决方案,而不是一个'黑客'之一。我也可以将对象作为“字符串”发送并自行解组,但我希望坚持使用注释的服务标准,并使用自定义序列化程序或某种类型的
web.xml
配置来处理(取消)编组。我喜欢使用
gson
,因为它简单(尤其是日期格式,不需要注释来排除字段等),但我也愿意使用
Jackson

编辑:它也可以是一种
POST
类型的服务,我只需要它有两个不同的类作为参数。

我认为最漂亮的解决方案是创建一个父对象,包含您想要传输的所有内容

@XmlRootElement
class AdvancedServiceInput {
    public MyEntity1 entity1;
    public MyEntity2 entity2;
}
然后通过接受容器对象来接收数据:

@GET
@Path("advancedService")
@Consumes(MediaType.APPLICATION_JSON)
public Response advancedService(AdvancedServiceInput input, @QueryParam("normalParam") int normalParam, @QueryParam("normalBoolean") boolean normalBoolean) {
    //Do stuff using both input.entity1 and input.entity2.
    return Response.ok().build();
}
是什么让这个解决方案如此漂亮:

  • 通常更少的参数可以提高可读性。拥有一个包含大量参数的方法,很难识别哪个参数用于哪个位置。(特别是,因为java不允许命名参数)
  • 拥有容器可以使代码更容易扩展。如果要添加第三种实体类型,只需扩展容器类,而不必更改(大量)方法签名
  • XML和JSON内容应该只包含一个单根元素。因此,无论如何,您可能必须使用这种方法来创建有效的传输消息
    • 在我看来,最漂亮的解决方案是创建一个父对象,其中包含您想要传输的所有内容

      @XmlRootElement
      class AdvancedServiceInput {
          public MyEntity1 entity1;
          public MyEntity2 entity2;
      }
      
      然后通过接受容器对象来接收数据:

      @GET
      @Path("advancedService")
      @Consumes(MediaType.APPLICATION_JSON)
      public Response advancedService(AdvancedServiceInput input, @QueryParam("normalParam") int normalParam, @QueryParam("normalBoolean") boolean normalBoolean) {
          //Do stuff using both input.entity1 and input.entity2.
          return Response.ok().build();
      }
      
      是什么让这个解决方案如此漂亮:

      • 通常更少的参数可以提高可读性。拥有一个包含大量参数的方法,很难识别哪个参数用于哪个位置。(特别是,因为java不允许命名参数)
      • 拥有容器可以使代码更容易扩展。如果要添加第三种实体类型,只需扩展容器类,而不必更改(大量)方法签名
      • XML和JSON内容应该只包含一个单根元素。因此,无论如何,您可能必须使用这种方法来创建有效的传输消息

      正如我所说,我不是在寻找“黑客”解决方案。仅仅为了解决一个问题而将我的项目与随机对象捆绑在一起并不是一个解决方案。正如我所说,我可以使用json字符串实现我想要的,但这不是问题的关键。甚至有可能在一个服务方法中有两种不同类型的对象吗?@Konstantine这是我能想象到的最漂亮的解决方案。但让我们看看——也许其他人发布了一个更漂亮的答案。很显然,从重复的帖子中可以看出,服务并不意味着接收不同类型的对象。我必须找到一种绕过这个限制的方法……正如我说的,我不是在寻找“黑客”解决方案。仅仅为了解决一个问题而将我的项目与随机对象捆绑在一起并不是一个解决方案。正如我所说,我可以使用json字符串实现我想要的,但这不是问题的关键。甚至有可能在一个服务方法中有两种不同类型的对象吗?@Konstantine这是我能想象到的最漂亮的解决方案。但让我们看看——也许其他人发布了一个更漂亮的答案。很显然,从重复的帖子中可以看出,服务并不意味着接收不同类型的对象。要想办法绕过这个限制。。。