ด้วยความช่วยเหลือของ@JsonViewเราสามารถตัดสินใจเลือกฟิลด์ของคลาสโมเดลที่จะทำให้เป็นอนุกรมซึ่งตรงตามเกณฑ์ขั้นต่ำ (เราต้องกำหนดเกณฑ์) เช่นเราสามารถมีคลาสคอร์หนึ่งคลาสที่มีคุณสมบัติ 10 อย่าง แต่มีเพียง 5 คุณสมบัติเท่านั้นที่สามารถทำให้เป็นอนุกรมซึ่งจำเป็นสำหรับลูกค้า เท่านั้น
กำหนดมุมมองของเราโดยสร้างคลาสต่อไปนี้:
public class Views
{
static class Android{};
static class IOS{};
static class Web{};
}
คลาสโมเดลที่มีคำอธิบายประกอบพร้อมมุมมอง:
public class Demo
{
public Demo()
{
}
@JsonView(Views.IOS.class)
private String iosField;
@JsonView(Views.Android.class)
private String androidField;
@JsonView(Views.Web.class)
private String webField;
...
..
}
ตอนนี้เราต้องเขียนตัวแปลง json ที่กำหนดเองโดยเพียงแค่ขยายคลาส HttpMessageConverter จากฤดูใบไม้ผลิเป็น:
public class CustomJacksonConverter implements HttpMessageConverter<Object>
{
public CustomJacksonConverter()
{
super();
this.delegate.getObjectMapper().configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
this.delegate.getObjectMapper().setSerializationInclusion(Include.NON_NULL);
}
private MappingJackson2HttpMessageConverter delegate = new MappingJackson2HttpMessageConverter();
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return delegate.canRead(clazz, mediaType);
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return delegate.canWrite(clazz, mediaType);
}
@Override
public List<MediaType> getSupportedMediaTypes() {
return delegate.getSupportedMediaTypes();
}
@Override
public Object read(Class<? extends Object> clazz,
HttpInputMessage inputMessage) throws IOException,
HttpMessageNotReadableException {
return delegate.read(clazz, inputMessage);
}
@Override
public void write(Object obj, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException
{
synchronized(this)
{
String userAgent = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("userAgent");
if ( userAgent != null )
{
switch (userAgent)
{
case "IOS" :
this.delegate.getObjectMapper().setConfig(this.delegate.getObjectMapper().getSerializationConfig().withView(Views.IOS.class));
break;
case "Android" :
this.delegate.getObjectMapper().setConfig(this.delegate.getObjectMapper().getSerializationConfig().withView(Views.Android.class));
break;
case "Web" :
this.delegate.getObjectMapper().setConfig(this.delegate.getObjectMapper().getSerializationConfig().withView( Views.Web.class));
break;
default:
this.delegate.getObjectMapper().setConfig(this.delegate.getObjectMapper().getSerializationConfig().withView( null ));
break;
}
}
else
{
this.delegate.getObjectMapper().setConfig(this.delegate.getObjectMapper().getSerializationConfig().withView( null ));
}
delegate.write(obj, contentType, outputMessage);
}
}
}
ตอนนี้จำเป็นต้องบอกให้ spring ใช้การแปลง json ที่กำหนดเองนี้โดยใส่สิ่งนี้ใน dispatcher-servlet.xml
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean id="jsonConverter" class="com.mactores.org.CustomJacksonConverter" >
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
นั่นคือวิธีที่คุณจะสามารถตัดสินใจได้ว่าช่องใดที่จะทำให้อนุกรม