我将使用Spring MVC 4.0.4,Hibernate 4.3.5和Jackson 2.5.4开发JSON REST服务。对于控制器,我需要@JsonView
来过滤属性。
我使用@JsonView(View.Summary.class)
和@JsonView(View.Details.class)
注释了一些Model的属性。当我对控制器进行注释以过滤其结果时(使用@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 Message Converter:
<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 :(得分:0)
我认为你的遗产改变了。您的控制器上的注释会询问使用View.Summary.class注释的所有内容。字段imageUrl使用@JsonView(View.Details.class)注释。鉴于View.Details扩展了View.Summary,View.Details类型的任何对象都具有与View.Summary的is-a关系,因此它从RestController返回。我相信您需要像这样定义View:
public class View {
public static interface Details {}
public static interface Summary extends Details {}
}
现在,摘要字段是一个详细信息字段,但详细信息字段是-NOT-a Summary字段。