在同一个 Jersey 服务中解组不同的对象
Unmarshalling different objects in same Jersey service
我正在尝试找到一种方法来创建一种服务,该服务将接收不同的对象类型 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
}
});
在data
配置中只需要读取对象结构,否则会混淆。我正在尝试发送这样的请求:
$.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
}
});
但它只是不会读取参数名称并且它被卡住了,因为它认为它必须将所有 data
结构解组到一个对象中。
我正在使用球衣 2.19。此外,我正在寻找一种正常的解决方案,而不是 'hacky' 的解决方案。我也可以将对象作为 'String' 发送并自己解组,但我想坚持使用注释的服务标准并使用自定义序列化程序或某种类型的 web.xml
配置来处理(联合国)编组。我喜欢使用 gson
是因为它的简单性(尤其是日期格式并且不需要字段排除等注释)但我也愿意使用 Jackson
。
编辑:它也可以是 POST
类型的服务,我只需要它有 2 个不同的 类 作为参数。
我认为最美丽的解决方案是创建一个父对象,其中包含您要传输的所有内容。
@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 不允许命名参数)
- 拥有容器使您的代码更容易扩展。如果你想添加第三个实体类型,你可以扩展你的容器 class 而你不必改变(很多)方法签名。
- XML 和 JSON 内容应该只包含 一个单根 元素。因此,您可能无论如何都必须使用这种方法来创建有效的传输消息。
我正在尝试找到一种方法来创建一种服务,该服务将接收不同的对象类型 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
}
});
在data
配置中只需要读取对象结构,否则会混淆。我正在尝试发送这样的请求:
$.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
}
});
但它只是不会读取参数名称并且它被卡住了,因为它认为它必须将所有 data
结构解组到一个对象中。
我正在使用球衣 2.19。此外,我正在寻找一种正常的解决方案,而不是 'hacky' 的解决方案。我也可以将对象作为 'String' 发送并自己解组,但我想坚持使用注释的服务标准并使用自定义序列化程序或某种类型的 web.xml
配置来处理(联合国)编组。我喜欢使用 gson
是因为它的简单性(尤其是日期格式并且不需要字段排除等注释)但我也愿意使用 Jackson
。
编辑:它也可以是 POST
类型的服务,我只需要它有 2 个不同的 类 作为参数。
我认为最美丽的解决方案是创建一个父对象,其中包含您要传输的所有内容。
@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 不允许命名参数)
- 拥有容器使您的代码更容易扩展。如果你想添加第三个实体类型,你可以扩展你的容器 class 而你不必改变(很多)方法签名。
- XML 和 JSON 内容应该只包含 一个单根 元素。因此,您可能无论如何都必须使用这种方法来创建有效的传输消息。