Skip to content

@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;
    
    }

    image-20250421164259345

  • 使用方式

    • 方式一:在类上(针对的是所有属性)或者某个属性上增加 @JsonInclude(JsonInclude.Include.NON_NULL)

    • 方式二:在配置文件中增加jackson配置(针对的是所有类的所有属性)

      yml
      spring:
          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) { // ... } ```

MIT版权,未经许可禁止任何形式的转载