Конечно, есть способ достичь того, что вы хотите (подробности см. Ниже). Но я призываю вас избегать этого.
Поскольку у вас есть разные полезные нагрузки, у вас должно быть разных классов для представления каждой полезной нагрузки.
Если вы все еще хотите следовать исходному пути, вы можете определить два вида:
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"
}