Как аннотацию @JsonView можно использовать для вложенных сущностей?

Я пытаюсь использовать аннотацию @JsonView для своих вложенных объектов. Чтобы быть более ясным, предположим, что у нас есть 2 объекта, каждый объект имеет свой собственный класс представления.

public class JsonViewAddress {
     //some view classes
}


public class Address {
   //fields annotated by JsonViewAddress's classes and @JsonProperty
}

public class JsonViewPerson {
  //some view classes
}

public class Person {

 //some fields (yes annotated with JsonViewPerson classes and @JsonProperty)

 //also assume that this is annotated with any JsonViewPerson's class.
 private Address address;

}

Давайте попробуем получить этот класс Person с типом Json из ответа

@Path("hey")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {


   @GET
   @Path("/stack/overflow")
   @JsonView(value = { /* WHAT SHOULD BE WRITTEN HERE ? */ })
   public Response method() {
       //return Person entity in response
   }
}

Аннотация @JsonView принимает массив строк, но как мне определить, что эти письменные классы представления должны работать явно для каждой сущности, к которой они принадлежат? Я хочу увидеть, что UserView работает для пользователя, AddressView работает для адреса, в ближайшее время.

благодаря.


person oko    schedule 28.10.2013    source источник


Ответы (1)


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

Я использую только один ViewObject

public class Views {

    public static class Low {
    }

    public static class Medium extends Low {
    }

    public static class High extends Medium {
    }
}

Каждый раз, когда у меня есть вложенный объект, он мне нужен в представлении Views.Low, поэтому я пишу Serializer для этого.

public class Serializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.writerWithView(Views.Low.class).writeValue(jgen, value);
    }
} 

Наконец, в моих объектах я использовал вот так:

public class Person {

   @JsonView(Views.High.class)
   @JsonSerialize(using = Serializer.class)
   private Address address;

}

Ресурс:

@Path("hey")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {


   @GET
   @Path("/stack/overflow")
   @JsonView(Views.High.class)
   public Response method() {
       //return Person entity in response with address low view
   }

   @GET
   @Path("/stack/overflow")
   @JsonView(Views.Medium.class)
   public Response method() {
       //return Person entity in response with no address
   }

}

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

person Panchitoboy    schedule 04.03.2015
comment
Работает как шарм! Одна вещь, которую следует упомянуть в сериализаторе, использует представление дочернего класса, если родительский и дочерний элементы имеют разные представления. - person Atul Sharma; 02.01.2020