在实习中遇到了一个不寻常的事情,今天和同事讨论一个小问题,同事使用swagger,想要调用一个接口,这个接口要传递一个json对象,对应java的一个实体类,但是有一个属性同事不想看到它,就用@JsonIgnore给注掉了(当时这个我不知道,😫),问题出现的场景是在调用另一个接口的时候,impl类里需要查询该字段,并向这个类传递这个属性。他从数据库中查询到数据后设置给了这个属性,最后调用json就是看不到这个属性。
开始看的时候我也懵了,调试都有数据,最终发现了是该属性加上了@JsonIgnore注解。正好向我想起之前一篇文章的另一个注解@JSONField。好奇心驱使我在swager中做了对比。
其实这个问题很简单的,只用在@ApiModelProperty注解中加上hidden = true就可以了(默认为false)。
这个问题解决。但是我是一个爱思考的人。他用的是@JSONField注解,而我之前没有用过这个注解,我决定是尝试使用一下。
一个简单的场景
实体类
@ApiModel
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AA {
@ApiModelProperty(name = "name")
Integer id;
@ApiModelProperty(name = "name")
String name;
@ApiModelProperty(name = "my_id")
int my_id;
List<String> list;
}
controller
@RestController
@RequestMapping("/admin/acl/index")
public class IndexController {
@GetMapping("/test")
public AA test() {
AA aa = new AA();
aa.setId(0);
aa.setName("");
aa.setMy_id(0);
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
aa.setList(list);
return aa;
}
}
所有测试针对list属性
1.list什么注解不加
swagger
postman
swagger竟然默认给到list一些信息。
postman也正常返回,毕竟什么也没加
2.只给list加上@JsonIgnore
查看结果
swagger
postman
swagger中没有list字段
postman中没有list字段
加上@JsonIgnore注解后,list字段就像消失了一样,没人知道它是否存在。
我之前用的是@JSONField,我不仅是测试还是复习,观察一下结果。
3.只给list加上@JSONField(name = "my_list")
swagger
postman
这个name属性怎么没有起作用?是swagger太强势了?
4.只给list加上@JSONField(serialize = false)
swagger
postman
这swagger这么强势吗?我的@JSONField直接失效,不序列化失效了。
不是swagger太强势,而是@JSONField就没有起作用,这个注解是fastjson的注解。
springboot中默认的json解析器是Jackson。如果不指定要用的json解析器,就会使用默认的。所以我们要想让它起作用就要指定fastjson为我们的默认json解析器。
这次测试忘记了这个知识点(看来我还待练)
在配置类加上下面代码即可
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return new HttpMessageConverters(converter);
}
查看效果
5.配置后只给list加上@JSONField(name = "my_list")
swagger
postman
swagger中的list没有使用别名
postman中使用了别名,并格式化了了json数据
6.配置后只给list加上@JSONField(serialize = false)
swagger
postman
swagger还是会有list字段
postman中已经接受不到这个字段了
总结:
1.不想在swagger文档中显示字段但传递是有这个字段就使用@ApiModelProperty(hidden = true)
2.不想在swagger文档中显示字段而且不想让字段在返回结果中使用@JsonIgnore(如果只使用一个注解)
3.想在swagger文档中显示字段而且不想让字段在返回结果中使用@JSONField(serialize = false)(如果只想使用这一个注解,暂时想不到有这样的场景,手动狗头)