JsonView筛选接口入参出参

JsonView可以有效筛选接口输入和输出的参数

  • 在底层新建 JacksonView。其中Find、One、List是输出用。Form、Create、Update是输入用。
    假设一个接口是@JsonView(JacksonView.One.class),则添加了Find、One的字段可以被查出。
    假设一个接口是@JsonView(JacksonView.Find.class),则添加了Find的字段可以被查出。
public interface JacksonView {

    interface Base {}

    interface Find extends Base {}

    interface One extends Find {}

    interface List extends Find {}

    interface Form extends Base {}

    interface Create extends Form {}

    interface Update extends Form {}

    interface Batch extends Base {}
}
  • 新建UserDO
@Data
@Entity
@Table(name = "a_user")
@DynamicInsert
@DynamicUpdate
@EqualsAndHashCode(exclude = "billDOList", callSuper = true)
@ToString(exclude = "billDOList", callSuper = true)
public class UserDO extends StatusDO {

    @Transient
    public static final String PREFIX_ID = "US";

    /**
     * 用户名
     */
    @Column(length = 20, nullable = false, unique = true)
    private String name;

    /**
     * 性别
     */
    @Enumerated(EnumType.STRING)
    private EntityEnum.Sex sex;

    /**
     * 账号
     */
    @Column(length = 20)
    private String account;

    /**
     * 密码
     */
    @Password
    @Column(length = 20, nullable = false)
    private String password;

    /**
     * 电话
     */
    @Cellphone
    @Column(unique = true)
    private String cellphone;

    /**
     * 邮箱
     */
    @Email
    @Column(unique = true)
    private String email;

    /**
     * 邮箱通知
     */
    private Boolean emailNotice;

    /**
     * 角色
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private EntityEnum.Role role;

    /**
     * 账单List
     */
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = {CascadeType.REMOVE})
    private Set<BillDO> billDOList;
}
  • 新建UserVO,这里根据需求分配增改查接口的所需字段。例如这里的cellphone、email、emailNotice、role、status、createDate、updateDate在findOne中显示,而不在findPage中显示
import com.fasterxml.jackson.annotation.JsonView;

public interface UserVO {

    @Getter
    enum SortVO implements com.hel.all.utils.controller.param.SortVO {

        /**
         * SEX
         */
        SEX(UserDO_.SEX),

        /**
         * CELLPHONE
         */
        CELLPHONE(UserDO_.CELLPHONE),

        /**
         * INS_DATE
         */
        INS_DATE(StatusDO_.INS_DATE);

        private String field;

        SortVO(String field) {
            this.field = field;
        }
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    class UserView {
        public static UserView of(UserDO user) {
            return Optional.of(user).map(u -> UserView.builder().id(u.getId())
            .name(u.getName()).sex(u.getSex()).account(u.getAccount())
			.password(u.getPassword()).cellphone(u.getCellphone())
			.email(u.getEmail()).emailNotice(u.getEmailNotice()).role(u.getRole())
			.status(u.getStatus()).createDate(u.getInsDate()).updateDate(u.getUpdateDate())
			.build()).get();
        }

        public static List<UserView> of(List<UserDO> list) {
            return list.stream().map(UserView::of).collect(Collectors.toList());
        }

        public UserDO toDo() {
            return this.toDo(new UserDO());
        }

        public UserDO toDo(UserDO userDO) {
            if (StringUtils.isNotBlank(this.name)) {
                userDO.setName(this.name);
            }

            if (Objects.nonNull(this.sex)) {
                userDO.setSex(this.sex);
            }

            if (StringUtils.isNotBlank(this.password)) {
                userDO.setPassword(this.password);
            }

            if (StringUtils.isNotBlank(this.cellphone)) {
                userDO.setCellphone(this.cellphone);
            }

            if (StringUtils.isNotBlank(this.email)) {
                userDO.setEmail(this.email);
            }

            return userDO;
        }

        @JsonView(JacksonView.Find.class)
        private String id;

        @JsonView({JacksonView.Find.class,JacksonView.Form.class})
        @NotBlank(groups = {JacksonView.Create.class})
        private String name;

        @JsonView({JacksonView.Find.class, JacksonView.Form.class})
        @NotNull(groups = {JacksonView.Create.class})
        private EntityEnum.Sex sex;

        @JsonView(JacksonView.Find.class)
        private String account;

        @JsonView(JacksonView.Form.class)
        @NotBlank(groups = {JacksonView.Create.class})
        private String password;

        @JsonView({JacksonView.One.class, JacksonView.Form.class})
        @NotBlank(groups = {JacksonView.Create.class})
        private String cellphone;

        @JsonView({JacksonView.One.class,JacksonView.Form.class})
        @NotBlank(groups = {JacksonView.Create.class})
        @Email
        private String email;

        @JsonView({JacksonView.One.class, JacksonView.Form.class})
        private Boolean emailNotice;

        @JsonView(JacksonView.One.class)
        private EntityEnum.Role role;

        @JsonView({JacksonView.One.class, JacksonView.Update.class})
        private UtilEnum.Status status;

        @JsonView(JacksonView.One.class)
        private Date createDate;

        @JsonView(JacksonView.One.class)
        private Date updateDate;
    }
  • 控制层
@GetMapping("/user/{userId}")
    @JsonView(JacksonView.One.class)
    public WrapVO.OneVO<UserVO.UserView> findOne(@PathVariable String userId) {
        UserDO userDO = userService.findOne(userId);
        return WrapVO.OneVO.of(UserVO.UserView.of(userDO));
    }
@GetMapping("/users")
    @JsonView(JacksonView.List.class)
    public WrapVO.PageVO<UserVO.UserView> findPage(){
     Page<UserDO> users =userService.findAll();
     return WrapVO.PageVO.of(users, UserVO.UserView.of(users.getContent()));
    }
@PostMapping("/user")
    @ResponseStatus(code = HttpStatus.CREATED)
    public WrapVO.BaseVO create(
        @JsonView(JacksonView.Create.class) @Validated(JacksonView.Create.class) @RequestBody UserVO.UserView form) {
        UserDO userDO = form.toDo();
        userService.create(userDO);
        return WrapVO.BaseVO.instance();
    }

ps:可以在UserVO.UserView中的字段中添加@NotBlank、@NotNull等判定条件,并在接口中添加@Validated(JacksonView.Create.class),则可以自动判定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值