Это не то, что я хочу или нужно сделать, потому что я могу придумать, как это сделать, просто @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.
Это мой профессор спрашивает что-то невозможное от меня? Я не вижу способа, которым я мог бы использовать два других сериализатора, которые он просит меня сделать, потому что их некуда реально поместить, кроме самого класса, который всегда их применял бы и не имеет смысла.