Как сопоставить другое имя свойству json на основе метода rest для @JsonView при весенней загрузке? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть 2 набора API-интерфейсов отдыха, реализованных с использованием загрузки Spring с использованием того же класса Java POJO. Я должен вернуть разные поля и с разными именами для нескольких полей на основе API. В настоящее время я использую @JsonView для одного набора API. Но мне также нужно дать другое имя для этого @JsonView. Пример: Поле 'host' должно быть названо как 'ip' для @JsonView, где 'host' для другого API. Я не уверен, как отобразить разные имена свойств в соответствии с @ JsonView.

Я проверил некоторые результаты, такие как использование MixIns. Но не знаю, как это сделать в API Spring Boot Rest, особенно на уровне метода.

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"} дляAPI getConInfo

{"host": "10xxx", "name": "con1"} для API getCon.

Actual: Получение {"host": "10xxx"} для API getConInfo

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Исходя из вашего описания проблемы, вы делаете это неправильно и, возможно, фактически не знаете, чего хотите.

  1. У вас есть две разные структуры JSON.
  2. Вы хотите отправить другой JSON на основе метода, который возвращает JSON.
  3. Каждый метод возвращает одну структуру JSON.
  4. У вас есть данные, которые "отображаются" в двух разных структурах.

Похоже, у вас уже есть данные, представленные в одном классе (возможно, используемые для доступа к базе данных);Я назову это классом VO. Попробуйте это:

  1. Создайте класс для каждой структуры JSON (два разных класса, один с именем хоста и один с IP).
  2. Используйте Джексона для представленияэтот класс в JSON (вы делаете это).
  3. Создайте маппер для получения данных из VO и создайте класс JSON по вашему выбору. Это может быть так просто, как DataMapper.makeHostnameJsonClass и DataMapper.makeIPJsonClass.
  4. . Использовать преобразователь в веб-обработчике для возврата правильного класса JSON.
  5. Объявить каждый веб-обработчик для возврата правильного класса JSON.
1 голос
/ 03 октября 2019

Конечно, есть способ достичь того, что вы хотите (подробности см. Ниже). Но я призываю вас избегать этого.

Поскольку у вас есть разные полезные нагрузки, у вас должно быть разных классов для представления каждой полезной нагрузки.


Если вы все еще хотите следовать исходному пути, вы можете определить два вида:

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"
}
...