项目中不用枚举是不行的,因为Spring boot默认使用jsckjson执行序列化于反序列化,所以对jackson添加操作,即可使得Spring boot请求周期均有该特性。
一、使用
1.定义枚举
合理使用@JsonCreator、@JsonValue 特性即可实现
package cn.com.iios.demo.enums;
import cn.com.iios.common.exception.EnumParseException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.SneakyThrows;
import java.util.HashMap;
import java.util.Map;
public enum UserPosition{
ADMIN(2,"普通用户"),
NOTADMIN(3,"管理员");
private Integer id;
private String name;
UserPosition(Integer id,String name){
this.id = id;
this.name = name;
}
public Integer getId(){
return this.id;
}
public String getName(){
return this.name;
}
/**
* 根据ID,返回实例
* @param id
* @return
* @throws Exception
*/
@JsonCreator
@SneakyThrows
public static UserPosition getById(Integer id){
for(UserPosition singleEnum:UserPosition.values()){
if(singleEnum.getId()==id){
return singleEnum;
}
}
throw new EnumParseException(UserPosition.class,id);
}
@JsonValue
public Map<Integer,String> toJson(){
Map map = new HashMap<Integer,String>();
map.put("id",getId());
map.put("name",getName());
return map;
}
}
2. 与Spring Data JPA结合
package cn.com.iios.demo.entity;
import cn.com.iios.common.entity.BaseEntity;
import cn.com.iios.demo.enums.UserPosition;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.SneakyThrows;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import javax.persistence.*;
@Data
@Entity
@Table(name = "user")
@Where(clause = "is_deleted != 1")
@SQLDelete(sql = "update user set is_deleted = 1 where id = ?")
public class User extends BaseEntity {
private String name;
public String getName(){
return name;
}
@Column(name="login_name")
private String loginName;
private String password;
private String uuid;
@Column(name="is_company_account")
private Boolean isCompanyAccount;
@Column(name="id_number")
private String idNumber;
@Column(name="is_admin")
private Integer isAdminOriginal;
@Transient
private UserPosition isAdmin;
@SneakyThrows
// 枚举项不能为空
public UserPosition getIsAdmin(){
// 用于Data JPA -> Service
if(isAdmin==null && isAdminOriginal!=null){
return UserPosition.getById(this.isAdminOriginal);
}
// 用于Restful -> Service
if(isAdmin!=null && isAdminOriginal == null){
return isAdmin;
}
// 其它状态均为空或不存在(不存在都成立的情况)
return null;
}
}