0

我使用相同的 Java POJO 类使用 Spring boot 实现了 2 组 rest API。我必须根据 API 返回不同的字段并为少数字段使用不同的名称。目前我正在为一组 API 使用 @JsonView。但我还需要为该@JsonView 提供不同的名称。例如:对于@JsonView,字段“host”需要命名为“ip”,而对于其他 API,字段“host”需要命名为“host”。我不确定如何根据@JsonView 映射不同的属性名称。

我检查了一些结果,比如使用 MixIns。但不确定如何在 Spring Boot Rest API 中进行操作,尤其是在方法级别。

public class Con {

@JsonView(View.ConInfo.class)
private String host;

private String name;

}

控制器方法:

@JsonView(View.ConInfo.class)
@GetMapping
public Con getConInfo()  {}

@GetMapping("/raw")
public Con getCon()  {}

预期:{"ip":"10xxx"} 用于 getConInfo API

{"host":"10xxx", "name":"con1"} 用于 getCon API。

实际:为 getConInfo API 获取 {"host":"10xxx"}

4

2 回答 2

2

当然有一种方法可以实现您想要的(请参阅下面的详细信息)。但我鼓励你避免它。

由于您有不同的有效负载,您应该有不同的类来表示每个有效负载。


如果您仍想遵循原来的路径,您可以定义两个视图:

public interface Views {

    interface Summary { }

    interface Details { }
}

然后按如下方式注释您的有效负载:

@Data
public class Payload {

    @JsonIgnore
    private String host;

    @JsonView(Views.Details.class)
    private String name;

    @JsonView(Views.Summary.class)
    public String getIp() {
        return host;
    }

    @JsonView(Views.Details.class)
    public String getHost() {
        return host;
    }
}

现在考虑以下方法,注释为@JsonView(Views.Summary.class)

@JsonView(Views.Summary.class)
@GetMapping(path = "/summary", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Payload> getSummary() {

    Payload payload = new Payload();
    payload.setHost("0.0.0.0");
    payload.setName("example");

    return ResponseEntity.ok(payload);
}

它将产生:

{
  "ip": "0.0.0.0"
}

现在考虑以下用 注释的方法@JsonView(Views.Details.class)

@JsonView(Views.Details.class)
@GetMapping(path = "/details", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Payload> getDetails() {

    Payload payload = new Payload();
    payload.setHost("0.0.0.0");
    payload.setName("example");

    return ResponseEntity.ok(payload);
}

它将产生:

{
  "host": "0.0.0.0",
  "name": "example"
}
于 2019-10-03T13:14:00.923 回答
1

根据您对问题的描述,您做错了,也许实际上并不知道您想要什么。

  1. 您有两种不同的 JSON 结构。
  2. 您希望根据返回 JSON 的方法发送不同的 JSON。
  3. 每个方法都将返回一个 JSON 结构。
  4. 您拥有“映射”到两种不同结构的数据。

似乎您已经拥有一个类中表示的数据(可能用于访问数据库);我将其称为 VO 类试试这个:

  1. 为每个 JSON 结构创建一个类(两个不同的类,一个带有主机名,一个带有 IP)。
  2. 使用 Jackson 在 JSON 中表示此类(您正在这样做)。
  3. 创建一个映射器以从 VO 获取数据并创建选择的 JSON 类。这可以像DataMapper.makeHostnameJsonClass和一样简单DataMapper.makeIPJsonClass
  4. 使用 Web 处理程序中的映射器返回正确的 JSON 类。
  5. 声明每个 Web 处理程序以返回正确的 JSON 类。
于 2019-10-03T13:51:39.507 回答