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),则可以自动判定。