Можно ли использовать класс @JsonSerializer на основе конечной точки REST? - PullRequest
0 голосов
/ 28 марта 2020

Это не то, что я хочу или нужно сделать, потому что я могу придумать, как это сделать, просто @JsonView, но в моей школьной работе есть бонусное задание, которое просит меня сделать заказ JSON сериализатор для предотвращения бесконечной рекурсивной взаимосвязи при двунаправленной взаимосвязи.

Код для реализации, который уже работает и достаточно прост:

public class CustomJson {
  public static class Shallow {
  }

  public static class Summary extends Shallow {
  }


  public static class ShallowSerializer extends JsonSerializer<Object> {
    @Override
    public void serialize(Object object, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
      throws IOException, JsonProcessingException {
      ObjectMapper mapper = new ObjectMapper()
        .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
        .setSerializationInclusion(JsonInclude.Include.NON_NULL);

      mapper.registerModule(new JavaTimeModule())
        .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

      mapper.setConfig(mapper.getSerializationConfig().withView(CustomJson.Shallow.class));

      jsonGenerator.setCodec(mapper);
      jsonGenerator.writeObject(object);
    }
  }
}
  @JsonView({CustomJson.Summary.class})
  @JsonSerialize(using = CustomJson.ShallowSerializer.class)
  private List<Registration> registrations = new ArrayList<>();

, который разрешается показывать Registration элементов на каждом Event элементе поверхностным способом.

Теперь, это работает, но после этого задание просит меня сделать следующее:

"Расширить этот пользовательский Класс Json с аналогичной реализацией пользовательских внутренних классов SummarySerializer и UnrestrictedSerializer, которые сериализуются в представление Summary и представление по умолчанию соответственно. Примените эти классы представления и сериализаторы к соответствующим атрибутам в классах модели Event и Registration. Сводный класс представления к конечным точкам localhost:8080/events и localhost:8080/events/{eventId}/registrations. Реализация неограниченных конечных точек в localhost:8080/events/{eventId} an d localhost:8080/events/{eventId}/registrations/{registrationId}. "

Что не имеет для меня большого смысла? Я полагаю, что есть несколько вещей, которые вы можете настроить в сериализаторе, хотя есть смысл, что вам может понадобиться более одного.

Проблема в том, что когда я пытаюсь использовать это, нет прямого пути к примените эти сериализаторы, насколько я знаю. Я попытался поместить аннотации @JsonSerializer с соответствующим сериализатором на самих конечных точках REST, но это не применяется.

Простое помещение JsonView в конечную точку REST работает, но, естественно, применяется только та часть представления, где он отображает только @JsonView аннотированных атрибутов в JSON.

Это мой профессор спрашивает что-то невозможное от меня? Я не вижу способа, которым я мог бы использовать два других сериализатора, которые он просит меня сделать, потому что их некуда реально поместить, кроме самого класса, который всегда их применял бы и не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...