Java 在同一服务中解组不同对象
我试图找到一种方法来创建一个服务,该服务将接收不同的对象类型(如JSON)并正确地解组它们。到目前为止,我能够使用自定义反序列化器和google的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) { /
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内容应该只包含一个单根元素。因此,无论如何,您可能必须使用这种方法来创建有效的传输消息