当前位置: 首页 > 工具软件 > JSONView > 使用案例 >

SpringMVC开发技巧--使用@JsonView注解

红朝
2023-12-01

一、我们常常遇到这样的业务场景:

当我们使用SpringMVC做controller进行查询信息,以Json的数据格式返回前端时,Json数据中常常涉及到一些用户名密码的查询,但出于安全性的考虑,我们可能不需要将用户对象User的所有信息(例如:密码)返回给前端。当我们使用@RestController注解时,返回的User对象则被自动转成了对应的Json数组传输给前端,我们无法将其密码等不必要的Json信息除去后再返回,为了解决这个Json数据的控制问题,我们可以使用JsonView注解进行开发。

二、@JsonView注解的使用步骤

1.使用接口来声明多个视图
User.java(实体类)

public class User {

    /**
    创建两个接口,
    一个为用户简单视图,即精简版的Json数据视图。
    另一个为用户详细视图,即完整版的Json数据视图
    **/
    //用户简单视图
    public interface UserSimpleView{}
    //用户详细视图(继承用户简单视图)
    public interface UserDetailView extends UserSimpleView{}

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

2.在值对象的get方法上指定视图(也可以在 字段名上面直接指定视图,结果是一样的)

public class User {
    /**
    创建两个接口,
    一个为用户简单视图,即精简版的Json数据视图。
    另一个为用户详细视图,即完整版的Json数据视图
    **/
    //用户简单视图
    public interface UserSimpleView{}
    //用户详细视图(继承用户简单视图)
    public interface UserDetailView extends UserSimpleView{}

    private String username;
    private String password;

    //Json简单视图/详细视图都需要username用户名这个属性,所以加在这个get方法上
    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    //Json简单视图不需要password密码这个属性,所以不加在这个get方法上
    //Json详细视图需要password密码这个属性,所以加在这个get方法上
    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3.在Controller方法上指定视图
UserController.java(Controller方法类)

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping
    //使用@JsonView注解加在Controller方法上表面这个方法返回的Json数据为简单视图(不显示密码)
    @JsonView(User.UserSimpleView.class)
    public List<User> query(UserQueryCondition condition,
    	@PageableDefault(page=2,size=17,sort="username,asc") Pageable pageable){
        System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
        System.out.println(pageable.getPageSize());
        System.out.println(pageable.getPageNumber());
        System.out.println(pageable.getSort());
        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        users.add(new User());
        return users;
    }


    @GetMapping("/{id:\\d+}")
    //使用@JsonView注解加在Controller方法上表面这个方法返回的Json数据为详细视图(显示用户名和密码)
    @JsonView(User.UserDetailView.class)
    public User getInfo(@PathVariable String id){
        User user = new User();
        user.setUsername("tom");
        return user;
    }
}

总结:

  1. 使用接口声明多个视图,多个视图之间可以继承
  2. 在值对象的 get 方法上指定视图,也可以 直接在 字段名上 指定视图,一个字段可以同时指定多个视图,例:
@JosnView({
	UserInterface1.class,
	UserInterface2.class,...
})
  1. 在相应的 controller 方法上指定视图,每个方法只能指定一个视图。
 类似资料: