2015-08-07 7 views
1

Я собираюсь разработать сервис JSON REST с использованием Spring MVC 4.0.4, Hibernate 4.3.5 и Jackson 2.5.4. Для контроллеров мне нужен @JsonView для фильтрации свойств.Использование @JsonView в Spring MVC 4 + jackson 2.5

Я аннотировал некоторые из свойств Модели с @JsonView(View.Summary.class) и @JsonView(View.Details.class). когда я аннотирую контроллеры для фильтрации своих результатов (с @JsonView(View.Summary.class)), он возвращает все аннотированные свойства без учета переданного класса представления (View.Summary.class).

Классы:

public class View { 
    public static interface Summary{} 
    public static interface Details extends Summary{} 
} 

Модель:

@Entity 
@Table(name="image") 
public class Image { 

    @JsonView(View.Summary.class) 
    private int id; 
    private String thumbnailURL; 

    @JsonView(View.Details.class) 
    private String imageURL; 
    private Date registrationDate; 
    private int price; 

    //..... getters and setters 
} 

Контроллер:

@JsonView(View.Summary.class) 
@RequestMapping(method = RequestMethod.GET, value = "/service/images") 
public List<Image> getAllImages(HttpServletResponse response) { 
     List<Image> list; 
     // codes for fetching the result 
     return list; 
} 

Spring Сообщение Конвертер:

<mvc:message-converters> 
     <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
       <bean class="com.digimind.utils.HibernateAwareObjectMapper"> 
       </bean> 
      </property> 
     </bean> 
    </mvc:message-converters> 

HibenrateAwareObjectMapper:

public class HibernateAwareObjectMapper extends ObjectMapper { 

    public HibernateAwareObjectMapper() { 

     Hibernate4Module hm = new Hibernate4Module(); 
     registerModule(hm); 
     this.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); 
     this.disable(MapperFeature.AUTO_DETECT_GETTERS); 

    } 
} 

Результат:

[ 
     { 
      "id": 3, 
      "imageURL": "url3" 
     }, 
     { 
      "id": 2, 
      "imageURL": "url 2" 
     } 
    ] 

Ожидаемый результат:

[ 
     { 
      "id": 3, 
     }, 
     { 
      "id": 2, 
     } 
    ] 

Спасибо за ваше внимание.

ответ

0

Я думаю, что у вас есть изменение наследования в обратном направлении. Ваша аннотация на вашем контроллере запрашивает все, что было аннотировано с помощью View.Summary.class. Поле imageUrl аннотируется с помощью @JsonView (View.Details.class). Учитывая, что View.Details расширяет View.Summary, любой объект типа View.Details имеет отношение is-a к View.Summary и поэтому возвращается из вашего RestController. Я считаю, что вам нужно определить вид, как это:

public class View { 
    public static interface Details {} 
    public static interface Summary extends Details {} 
} 

Теперь сводное поле является-поле Detail но Detail поле-НЕ-сводка поля.

Смежные вопросы