model 代码:
public class A{
private long id;
private String name;
private String avatar;
private int score;
private B b;
//......setter and getter
}
controller代码:
@RequestMapping("/A")
@ResponseBody
public A getModel(){
A a = new A();
a.setName("one");
a.setAvatar("avatar.jpg");
return a;
}
那么在前端请求/A时就会得到:
{id:0,name:"one",avatar:"avatar.jpg",score:0,b:null}
这不是我希望的结果,我希望前端只能拿到它所需要的name 和 avatar。
用mybatis时,每次查询结果数据,用Map来承载,而不是bean,在Controller中也是如此(甚至可以剔除model层)。但这样就要求对数据库表非常了解,而牺牲了很多便利操作(如 增、改操作)
jackson,@JsonIgnore。不满足要求,需要序列化的Property,并非固定的。这次我要id,name,下次我可能要name,score
可以使用jackson的Include.NON_DEFAULT 属性为默认值不序列化
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化
jackson 字段动态过滤
https://github.com/bohnman/squiggly-filter-jackson
https://github.com/narusas/SpringMvcJacksonFilter
https://github.com/shihyuho/jackson-dynamic-filter
使用AOP;自己定义注解,然后在返回的时候加上需要过滤的字段.
切面到自己定义的注解上,然后使用上面的工具,我自己使用 https://github.com/bohnman/sq...
这是我的工具类
https://github.com/yujunhao8831/spring-boot-start-current/blob/master/aidijing-common/src/main/java/com/aidijing/common/util/JsonUtils.java
实现 ResponseBodyAdvice<T> 接口,如果这样,那么就需要使用统一的返回值类型,把之前的返回值包装起来.
这样在Spring Response 写出去之前,你可以对这些数据进行处理,还是使用jackson的过滤特性.
我之前就是这样做的, https://github.com/yujunhao88... 你可以参考下
返回之前就立马进行过滤.
我之后准备采用这个, https://github.com/yujunhao88...
你可以参考下,不过这不是最终的,还在完善中
可以使用fastJson 对javabean的排除属性设置@JSONField(serialize=false) 前提实现序列化
如果不是固定返回 那么最好在controller返回的时候 使用方法吧bean转成json字符串
方法如下:
/**
从对象中序列化指定字段的json串
@param object
@param keys 需要序列化的key值
@return
*/
public static String object2Json(Object object, String... keys) {
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(object.getClass(),keys);
return toJSONString(object,filter, SerializerFeature.WriteMapNullValue);
}