代码拉取完成,页面将自动刷新
springboot 统一版本 2.5.0
请求参数中,通过枚举限制 传入一些参数值。原生状态下,直接传入枚举name即可。
结果就是 枚举中的name 直接传入数据库。
/* 枚举定义 */
public enum PositioneEnum {
Sales("1", "销售"),
Purchasing("2", "采购"),
GeneralManager("0", "总经理");
private String code;
private String msg;
}
/* jpa 实体定义 */
public class User {
private Long id;
@Enumerated(EnumType.STRING)
private PositioneEnum position;
/*省略其他字段和相关注解*/
}
/* 请求实体定义 */
public class RegisterUserRequest {
private String employeeNo;
private PositioneEnum position;
}
{
"employeeNo": "test_2054abc368a9",
"position": "GeneralManager"
}
[
{
"type": "Positione",
"key": "Sales",
"value": "1"
},
{
"type": "Positione",
"key": "Purchasing",
"value": "2"
},
{
"type": "Positione",
"key": "GeneralManager",
"value": "3"
}
]
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
// 继承AttributeConverter;自定义 OrderTypeEnumConvert 实现转换
@Convert(converter = OrderTypeEnumConvert.class)
@Column(nullable = false)
private OrderTypeEnum orderType;
}
对于企业应用系统,当前的硬件资源和技术条件已经很给力了,通常情况下,我们大可不必为了追求性能而将类型、状态等字段定义成数字类型;而编写易理解、可维护的系统,已经越发显得重要了。将这些字段定义成字符串类型,用字符串来描述字段值,就是易理解的一个重要体现。
varchar
取代int
(或tinyint
)。毋庸置疑,字母组合总比1,2,3,4 这样的数字易于识别。数字带有天然的排序性,不方便再插入中间状态或者不按顺序的操作。为枚举定义统一的接口,在使用的时候更加保持统一
public interface EnumAbility <T>{
/**
* 返回枚举实际值
* JsonValue 处理 Jackson 序列化问题
*/
@JsonValue
T getCode();
/**
* 返回枚举描述
*/
String getDescription();
/**
* 对比当前枚举对象和传入的枚举值是否一致(String类型会忽略大小写)
* 当前枚举项是否匹配远端传入的值(比如:数据库的字段值、rpc传入的参数值)
*
* @param enumCode 枚举 code
* @return 是否匹配
*/
default boolean codeEquals(T enumCode){
if(enumCode ==null) return false;
if(enumCode instanceof String){
return ((String) enumCode).equalsIgnoreCase((String) getCode());
}else {
return Objects.equals(this.getCode(), enumCode);
}
}
/**
* 对比两个枚举项是否完全相同(==)
*
* @param anotherEnum 枚举
* @return 是否相同
*/
default boolean equals(EnumAbility<T> anotherEnum){
return this == anotherEnum;
}
}
public class EnumAbilityUtil {
public static <E extends Enum<E>, T> EnumAbility<T> getEnumByCode(Class<E> enumClass, T code) {
if (code == null) {
return null;
}
EnumSet<E> es = EnumSet.allOf(enumClass);
for (E anEnum : es) {
if (anEnum instanceof EnumAbility) {
if (((EnumAbility) anEnum).codeEquals(code)) {
return (EnumAbility<T>) anEnum;
}
}
}
return null;
}
}
@RequestBody,@ResponseBody
使用 @JsonValue 注解,在getCode 代码上,Jackson 序列化 就会处理
@JsonValue
T getCode();
@RequestParam,@PathVariable 。 实现 ConverterFactory 接口,并在FormatterRegistry 进行注入
/**
* 用于 RequestParam 和 PathVariable 参数转化
*/
public class EnumAbilityConverterFactory implements ConverterFactory<String, EnumAbility<String>> {
@Override
public <T extends EnumAbility<String>> Converter<String, T> getConverter(Class<T> targetType) {
return source -> {
for (T enumConstant : targetType.getEnumConstants()) {
if (Objects.equals(enumConstant.getCode(), source)) ;
{
return enumConstant;
}
}
return null;
};
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new EnumAbilityConverterFactory());
WebMvcConfigurer.super.addFormatters(registry);
}
}
使用枚举中的code 作为和数据库交换,而不是用name作为值存入
AttributeConverter
接口/**
* 用于 jpa 值 转换
* @param <T>
*/
public abstract class EnumAbilityJpaConvert<T> implements AttributeConverter<EnumAbility<T>, T> {
private final Class<? extends Enum> enumClass;
protected EnumAbilityJpaConvert(Class<? extends Enum> enumClass) {
this.enumClass = enumClass;
}
@Override
public T convertToDatabaseColumn(EnumAbility<T> anEnum) {
return anEnum.getCode();
}
@Override
public EnumAbility<T> convertToEntityAttribute(T code) {
return EnumUtil.getEnumByCode(enumClass, code);
}
}
/**
* 枚举定义
*/
@Getter
@AllArgsConstructor
public enum OrderTypeEnum implements EnumAbility<String> {
NEW("0", "新建待支付"),
PAID("2", "支付完成"),
SHIPPED("3", "已发货");
private String code;
private String description;
}
/**
* 枚举转换定义
*/
public class OrderTypeEnumJpaConvert extends EnumAbilityJpaConvert<String> {
protected OrderTypeEnumJpaConvert() {
super(OrderTypeEnum.class);
}
}
/**
* 应用
*/
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Convert(converter = OrderTypeEnumJpaConvert.class)
@Column(nullable = false)
private OrderTypeEnum orderType;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。