@JsonView

com.fasterxml.jackson.annotation.JsonView

@JsonView是jackson json中的一个注解,SpingMVC也支持这个注解

此注解的主要用途就是当你返回实体类时去除敏感信息。比如:有个user表里面有个pwd字段,查询出user后,不想返回pwd字段,可以使用此注解去除pwd字段。

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD,
	    ElementType.PARAMETER, // since 2.5
	    ElementType.TYPE // since 2.9, to indicate "default view" for properties
})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonView {
    /**
     * View or views that annotated element is part of. Views are identified
     * by classes, and use expected class inheritance relationship: child
     * views contain all elements parent views have, for example.
     */
    public Class[] value() default { };
}

 

1. @JsonView使用步骤

  1. 使用接口来声明多个视图
  2. 在值对象的get方法上指定视图
  3. Controller方法上指定视图
public class User {
    private String username;
    private String password;
    private Integer age;

@JsonView注解不是Spring的,它位于jackson-annotation包中

作用:SpringMvc使用@ResponseBody将结果以json返回客户端,有些实体类的某些字段可以不被包括在JSON中

使用情形有多方调用这个接口,需要针对不同业务场景返回不同形式的JSON,但是这种情况的话 只拷贝需要的属性 再返回也能达到目的,但是这样没有逼格


2. 案例演示

查询列表请求中,不返回password字段
获取用户详情中,返回password字段

public class User {
    /**
     * 用户简单视图
     */
    public interface UserSimpleView{};
    /**
     * 用户详情视图
     */
    public interface UserDetailView extends UserSimpleView{};
    private String username;
    private String password;
    private Integer age;
    public User() {}
    public User(String username, String password, Integer age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }
    @JsonView(UserSimpleView.class)
    public String getUsername() { return username; }
    
    @JsonView(UserDetailView.class)
    public String getPassword() {return password;}
    
    @JsonView(UserSimpleView.class)
    public Integer getAge(){return age;}
    
    public void setUsername(String username) { this.username = username; }
    public void setPassword(String password) { this.password = password; }
    public void setAge(Integer age) { this.age = age; }
}
  •  这里完成了步骤1和步骤2
  • 定义了步骤1的两个视图接口UserSimpleViewUserDetailViewUserDetailView继承UserSimpleViewUserDetailView拥有视图UserSimpleView的属性
  • 完成了步骤2的在相应的get方法上声明JsonView 
/**
 * 在查询列表请求中,不返回password字段
 * http://localhost:8080/user/
 */
@GetMapping("/user")
@JsonView({User.UserSimpleView.class})
public List query(){
    //...
    List users = new ArrayList<>();
    users.add(new User("蔡徐坤","666",18));
    users.add(new User("乔碧萝","999",58));
    return users;
}
/**
 * 在获取用户详情中,返回password字段
 * http://localhost:8080/user/乔碧萝
 */
@GetMapping("/user/{userName}")
@JsonView(User.UserDetailView.class)
public User get(@PathVariable String userName){
    if("乔碧萝".equals(userName)){

        return new User("乔碧萝","999",58);
    }else {
        return new User("没有这个用户",null,null);
    }
}

 完成步骤3,在不同Controller的方法上使用视图

@JsonView_第1张图片

@JsonView_第2张图片


没有@JsonView注释的方法不会返回对应的字段 

@JsonView_第3张图片

@JsonView_第4张图片

@JsonView_第5张图片

 @JsonView 注释在set方法上效果也是一样的

@JsonView(UserSimpleView.class)
public void setUsername(String username) { this.username = username; }

@JsonView(UserDetailView.class)
public void setPassword(String password) { this.password = password; }

@JsonView(UserSimpleView.class)
public void setAge(Integer age) { this.age = age; }

public String getUsername() { return username; }
public String getPassword() {return password;}
public Integer getAge(){return age;}

@JsonView_第6张图片

@JsonView_第7张图片


@JsonView 放在类上

前面我们每个字段的get或set方法都需要加@JsonView,这样也太麻烦了。把@JsonView加在类上就能解决这个问题

放在实体类上作为一种默认的视图。比如我们上面的User实体类,在实体类上加上@JsonView(User.UserSimpleView.class),这就是表明凡是返回User的地方如果没有显示指定所需要返回的视图,则默认使用BaseView视图。

@JsonView(User.UserSimpleView.class)
public class User {
    /**
     * 用户简单视图
     */
    public interface UserSimpleView{};
    /**
     * 用户详情视图
     */
    public interface UserDetailView extends UserSimpleView{};
    private String username;
    private String password;
    private Integer age;
    public User() {}
    public User(String username, String password, Integer age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }
    @JsonView(UserDetailView.class)
    public String getUsername() { return username; }

    public String getPassword() {return password;}
    public Integer getAge(){return age;}
    
    public void setUsername(String username) { this.username = username; }
    public void setPassword(String password) { this.password = password; }
    public void setAge(Integer age) { this.age = age; }
}

@JsonView_第8张图片 

@JsonView_第9张图片 

 


  • https://www.jianshu.com/p/dab9dae5bf20
  • http://www.bubuko.com/infodetail-2995374.html
  • https://blog.csdn.net/cauchy6317/article/details/92788938

 

你可能感兴趣的:(SpringMVC)