@JsonInclude:设置实体对象中为null的属性不返回
效果演示
java@RestController @RequestMapping("/test") public class TestController { @SaIgnore @GetMapping("/ignore") public List<User> ignore() { List<User> userList = new ArrayList<>(); User user1 = new User(); user1.setUsername("张三"); user1.setPassword("12321313"); User user2 = new User(); user2.setUsername("李四"); userList.add(user1); userList.add(user2); return userList; } } @Data // 设置为null的属性不会返回给前端 @JsonInclude(JsonInclude.Include.NON_NULL) public class User extends BaseEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 主键 */ @Id(keyType = KeyType.Generator, value = KeyGenerators.uuid) private String id; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 用户昵称 */ private String nickname; /** * 性别 M: 男 W: 女 */ private String gender; /** * 出生年月 */ private Date birthYearMonth; }
使用方式
方式一:在类上(针对的是所有属性)或者某个属性上增加
@JsonInclude(JsonInclude.Include.NON_NULL)方式二:在配置文件中增加jackson配置(针对的是所有类的所有属性)
ymlspring: jackson: default-property-inclusion: NON_EMPTY
@JsonView控制controller返回哪些字段
注解说明:有些前端不需要的字段返回的话,可能会占用网络带宽,此注解就是用来控制c层返回哪些字段
使用场景一:对单个字段进行控制
java@Data public class User { // 2. 在相应的字段上使用字段标识 @JsonView(UsernameJsonView.class) private String username; @JsonView(SexJsonView.class) private String sex; @JsonView(AddressJsonView.class) private String address; // 1. 新增多个接口,用于字段标识 public interface UsernameJsonView {} public interface SexJsonView {} public interface AddressJsonView {} }java// 3. 在控制层使用@JsonView进行控制 @JsonView(UsernameJsonView.class) @GetMapping("/getInfo/{id}") public User getInfo(@PathVariable String id) { // ... }注意:不是说一定要给每个属性都定义一个标识,多个字段可以共用同一个标识
使用场景二:对多个字段进行组合控制
方式一:JsonView的代码定义如下,所以如果想对多个字段进行控制,可以在使用@JsonView传入一个Class数组
java@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotation public @interface JsonView { public Class<?>[] value() default { }; }java@JsonView({UsernameJsonView.class, SexJsonView.class}) @GetMapping("/getInfo/{id}") public User getInfo(@PathVariable String id) { // ... }方式二:再次定义一个标识,继承字段标识,然后使用这个新的标识进行组合式控制
java// 1. 新增接口,用于字段标识 public interface UsernameAndSexJsonView extends UsernameJsonView,SexJsonView {}java@Data public class User { // 2. 字段上依旧使用单个的标识 @JsonView(UsernameJsonView.class) private String username; @JsonView(SexJsonView.class) private String sex; @JsonView(AddressJsonView.class) private String address; // 字段标识 public interface UsernameJsonView {} public interface SexJsonView {} public interface AddressJsonView {} }java// 3. 在控制层使用组合式的标识进行控制 @JsonView(UsernameAndSexJsonView.class) @GetMapping("/getInfo/{id}")
public User getInfo(@PathVariable String id) { // ... } ```