在 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,但没有 emailsessionId:

{ "fistName": "John", "lastName": "Smith" }

我该怎么做?

如何在不必实际使用 2 个不同的 DTO 进行响应的情况下实现这一目标?这可能吗? @JsonIgnoreProperty 之类的注释将不起作用,因为那会永久忽略 属性。

我正在寻找最优雅的解决方案。非常感谢:-)

使用@JsonView 根据序列化上下文过滤字段。当向 REST 客户端返回数据时,根据调用的 REST 服务,我们需要限制哪些数据将被序列化,同时使用相同的数据模型。

有关更多详细信息,可以在 Whosebug

上查看此

baeldung.com 上还有一篇关于@JsonView 和 Spring 安全集成的好文章,用于根据安全性过滤公开数据