在 Spring 框架和 Apache CXF 中自定义 JSON 序列化
Custom JSON serialization in Spring Framework and Apache CXF
在我的 Spring 框架项目中,我正在编写 Web 服务 (Apache CXF),其中我使用 JacksonJsonProvider(反)序列化输入和输出。
我想每次都以不同的方式序列化 DTO 对象。我知道我可以使用自定义序列化程序并覆盖 Jackson 的一些功能,但我的要求是我每次都想以不同的方式进行!
示例:
这是我的DTOclass我要序列化
public class MyDTO {
private Long sessionId;
private String firstName;
private String lastName;
private String email;
...
}
这是我的两个网络服务方法:
@GET
@Path("/example1")
public Response myWsMethodExample1(...) {
MyDTO dto = new MyDto();
...
return Response.status(Status.OK).entity(dto).type(MediaType.APPLICATION_JSON).build();
}
@GET
@Path("/example2")
public Response myWsMethodExample2(...) {
MyDTO dto = new MyDto();
...
return Response.status(Status.OK).entity(dto).type(MediaType.APPLICATION_JSON).build();
}
我希望 API 调用 /example1 生成 :
{ "sessionId": 1, "fistName": "John", "lastName": "Smith", "email": "john@smith.com" }
并调用 /example2 生成 相同的 DTO,但没有 email
和 sessionId
:
{ "fistName": "John", "lastName": "Smith" }
我该怎么做?
如何在不必实际使用 2 个不同的 DTO 进行响应的情况下实现这一目标?这可能吗? @JsonIgnoreProperty 之类的注释将不起作用,因为那会永久忽略 属性。
我正在寻找最优雅的解决方案。非常感谢:-)
使用@JsonView 根据序列化上下文过滤字段。当向 REST 客户端返回数据时,根据调用的 REST 服务,我们需要限制哪些数据将被序列化,同时使用相同的数据模型。
有关更多详细信息,可以在 Whosebug
上查看此
baeldung.com 上还有一篇关于@JsonView 和 Spring 安全集成的好文章,用于根据安全性过滤公开数据
在我的 Spring 框架项目中,我正在编写 Web 服务 (Apache CXF),其中我使用 JacksonJsonProvider(反)序列化输入和输出。
我想每次都以不同的方式序列化 DTO 对象。我知道我可以使用自定义序列化程序并覆盖 Jackson 的一些功能,但我的要求是我每次都想以不同的方式进行!
示例:
这是我的DTOclass我要序列化
public class MyDTO {
private Long sessionId;
private String firstName;
private String lastName;
private String email;
...
}
这是我的两个网络服务方法:
@GET
@Path("/example1")
public Response myWsMethodExample1(...) {
MyDTO dto = new MyDto();
...
return Response.status(Status.OK).entity(dto).type(MediaType.APPLICATION_JSON).build();
}
@GET
@Path("/example2")
public Response myWsMethodExample2(...) {
MyDTO dto = new MyDto();
...
return Response.status(Status.OK).entity(dto).type(MediaType.APPLICATION_JSON).build();
}
我希望 API 调用 /example1 生成 :
{ "sessionId": 1, "fistName": "John", "lastName": "Smith", "email": "john@smith.com" }
并调用 /example2 生成 相同的 DTO,但没有 email
和 sessionId
:
{ "fistName": "John", "lastName": "Smith" }
我该怎么做?
如何在不必实际使用 2 个不同的 DTO 进行响应的情况下实现这一目标?这可能吗? @JsonIgnoreProperty 之类的注释将不起作用,因为那会永久忽略 属性。
我正在寻找最优雅的解决方案。非常感谢:-)
使用@JsonView 根据序列化上下文过滤字段。当向 REST 客户端返回数据时,根据调用的 REST 服务,我们需要限制哪些数据将被序列化,同时使用相同的数据模型。
有关更多详细信息,可以在 Whosebug
上查看此baeldung.com 上还有一篇关于@JsonView 和 Spring 安全集成的好文章,用于根据安全性过滤公开数据