字典序列化

master
lzq 2025-12-17 18:35:42 +08:00
parent 08cfaa9665
commit 9d1f8beac9
22 changed files with 279 additions and 58 deletions

View File

@ -1,14 +1,12 @@
package com.njzscloud.common.core.fastjson.serializer;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.reader.ObjectReader;
import com.alibaba.fastjson2.util.TypeUtils;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.core.ienum.Dict;
import com.njzscloud.common.core.ienum.DictInt;
import com.njzscloud.common.core.ienum.DictStr;
import com.njzscloud.common.core.ienum.IEnum;
import com.njzscloud.common.core.ienum.*;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Type;
@ -40,18 +38,28 @@ public class DictObjectDeserializer implements ObjectReader<Dict> {
Map<String, Object> map = jsonReader.readObject();
String typeField = (String) map.get(IEnum.ENUM_TYPE);
Object valField = map.get(Dict.ENUM_VAL);
Class<?> clazz;
if (typeField == null) {
clazz = TypeUtils.getClass(fieldType);
} else {
clazz = CLASSLOADER.loadClass(typeField);
}
Class<?> clazz = CLASSLOADER.loadClass(typeField);
if (valField instanceof String) {
if (valField instanceof String val) {
if (DictStr.class.isAssignableFrom(clazz)) {
if (clazz.isEnum()) {
DictStr[] constants = (DictStr[]) clazz.getEnumConstants();
return Dict.parse((String) valField, constants);
return Dict.parse(val, constants);
} else {
if (StrUtil.isBlank(val)) return null;
String keyField = (String) map.get(Dict.ENUM_KEY);
return DictItem.get(keyField, val);
}
} else if (DictInt.class.isAssignableFrom(clazz)) {
DictInt[] constants = (DictInt[]) clazz.getEnumConstants();
return Dict.parse(Integer.parseInt((String) valField), constants);
return Dict.parse(Integer.parseInt(val), constants);
} else {
return null;
}
@ -71,12 +79,19 @@ public class DictObjectDeserializer implements ObjectReader<Dict> {
} else {
if (jsonReader.isString()) {
Class<?> clazz = TypeUtils.getClass(fieldType);
if (DictStr.class.isAssignableFrom(clazz)) {
String val = jsonReader.readString();
if (DictStr.class.isAssignableFrom(clazz)) {
if (clazz.isEnum()) {
DictStr[] constants = (DictStr[]) clazz.getEnumConstants();
return Dict.parse(val, constants);
} else {
if (StrUtil.isBlank(val)) return null;
DictKey annotation = clazz.getAnnotation(DictKey.class);
if (annotation == null) return null;
String value = annotation.value();
return DictItem.get(value, val);
}
} else if (DictInt.class.isAssignableFrom(clazz)) {
String val = jsonReader.readString();
DictInt[] constants = (DictInt[]) clazz.getEnumConstants();
return Dict.parse(Integer.parseInt(val), constants);
} else {

View File

@ -56,6 +56,7 @@ public class DictObjectSerializer implements ObjectWriter<Dict> {
jsonWriter.writeColon();
jsonWriter.writeString(dict.getClass().getName());
if (dict.getClass().isEnum()) {
jsonWriter.writeName(IEnum.ENUM_NAME);
jsonWriter.writeColon();
jsonWriter.writeString(((Enum<?>) dict).name());
@ -63,6 +64,11 @@ public class DictObjectSerializer implements ObjectWriter<Dict> {
jsonWriter.writeName(IEnum.ENUM_ORDINAL);
jsonWriter.writeColon();
jsonWriter.writeInt32(((Enum<?>) dict).ordinal());
}
jsonWriter.writeName(Dict.ENUM_KEY);
jsonWriter.writeColon();
jsonWriter.writeAny(dict.getKey());
jsonWriter.writeName(Dict.ENUM_VAL);
jsonWriter.writeColon();
@ -83,12 +89,21 @@ public class DictObjectSerializer implements ObjectWriter<Dict> {
jsonWriter.writeName(fieldName + "Txt");
jsonWriter.writeColon();
jsonWriter.writeString(dictInt.getTxt());
jsonWriter.writeName(fieldName + "Key");
jsonWriter.writeColon();
jsonWriter.writeString(dictInt.getKey());
} else if (DictStr.class.isAssignableFrom(clazz)) {
DictStr dictStr = (DictStr) object;
jsonWriter.writeString(dictStr.getVal());
jsonWriter.writeName(fieldName + "Txt");
jsonWriter.writeColon();
jsonWriter.writeString(dictStr.getTxt());
jsonWriter.writeName(fieldName + "Key");
jsonWriter.writeColon();
jsonWriter.writeString(dictStr.getKey());
} else {
jsonWriter.writeNull();
}

View File

@ -33,6 +33,11 @@ public interface Dict<T> extends IEnum {
* txt
*/
String ENUM_TXT = "txt";
/**
* <br/>
* key
*/
String ENUM_KEY = "key";
/**
* "值"
@ -52,6 +57,13 @@ public interface Dict<T> extends IEnum {
return null;
}
/**
*
*/
default String getKey() {
return "";
}
/**
*
*

View File

@ -0,0 +1,72 @@
package com.njzscloud.common.core.ienum;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson2.annotation.JSONType;
import com.njzscloud.common.core.fastjson.serializer.DictObjectDeserializer;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@Getter
@Setter
@ToString
@Accessors(chain = true)
@JSONType(deserializer = DictObjectDeserializer.class)
public class DictItem implements DictStr {
private static final Map<String, List<DictItem>> cache = new ConcurrentHashMap<>();
private String key;
private String val;
private String txt;
public static void put(String key, DictItem dictItem) {
cache.compute(key, (k, v) -> {
if (v == null) v = new LinkedList<>();
v.add(dictItem);
return v;
});
}
public static void put(String key, List<DictItem> list) {
cache.put(key, new LinkedList<>(list));
}
public static DictItem get(String key, String val) {
DictItem dictItem = new DictItem();
cache.compute(key, (k, v) -> {
if (CollUtil.isNotEmpty(v)) {
Optional<DictItem> first = v.stream().filter(it -> it.val.equals(val)).findFirst();
if (first.isPresent()) {
DictItem data = first.get();
dictItem.key = data.key;
dictItem.val = data.val;
dictItem.txt = data.txt;
}
}
return v;
});
if (dictItem.key == null) return null;
return dictItem;
}
public static void clear() {
cache.clear();
}
public static void remove(String key, String val) {
cache.compute(key, (k, v) -> {
if (CollUtil.isNotEmpty(v)) v.removeIf(it -> it.val.equals(val));
return v;
});
}
public static void remove(String key) {
cache.remove(key);
}
}

View File

@ -0,0 +1,15 @@
package com.njzscloud.common.core.ienum;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
@Target({FIELD, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface DictKey {
String value();
}

View File

@ -1,5 +1,6 @@
package com.njzscloud.common.core.jackson.serializer;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonStreamContext;
import com.fasterxml.jackson.core.JsonToken;
@ -9,10 +10,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.IntNode;
import com.fasterxml.jackson.databind.node.TextNode;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.core.ienum.Dict;
import com.njzscloud.common.core.ienum.DictInt;
import com.njzscloud.common.core.ienum.DictStr;
import com.njzscloud.common.core.ienum.IEnum;
import com.njzscloud.common.core.ienum.*;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@ -106,8 +104,16 @@ public class DictDeserializer extends JsonDeserializer<Dict> {
Class<?> clazz = field.getType();
if (DictStr.class.isAssignableFrom(clazz)) {
String val = p.getValueAsString();
if (clazz.isEnum()) {
DictStr[] constants = (DictStr[]) clazz.getEnumConstants();
return Dict.parse(val, constants);
} else {
if (StrUtil.isBlank(val)) return null;
DictKey annotation = field.getAnnotation(DictKey.class);
if (annotation == null) return null;
String value = annotation.value();
return DictItem.get(value, val);
}
} else if (DictInt.class.isAssignableFrom(clazz)) {
int val = p.getValueAsInt();
DictInt[] constants = (DictInt[]) clazz.getEnumConstants();

View File

@ -46,8 +46,11 @@ public class DictSerializer extends JsonSerializer<Dict> {
if (ctx.inRoot()) {
gen.writeStartObject();
gen.writeStringField(IEnum.ENUM_TYPE, value.getClass().getName());
if (value.getClass().isEnum()) {
gen.writeStringField(IEnum.ENUM_NAME, ((Enum<?>) value).name());
gen.writeNumberField(IEnum.ENUM_ORDINAL, ((Enum<?>) value).ordinal());
}
gen.writeObjectField(Dict.ENUM_KEY, value.getKey());
gen.writeObjectField(Dict.ENUM_VAL, value.getVal());
gen.writeStringField(Dict.ENUM_TXT, value.getTxt());
gen.writeEndObject();
@ -55,6 +58,7 @@ public class DictSerializer extends JsonSerializer<Dict> {
gen.writeObject(value.getVal());
String currentName = ctx.getCurrentName();
gen.writeStringField(currentName + "Txt", value.getTxt());
gen.writeStringField(currentName + "Key", value.getKey());
}
}
}

View File

@ -1,11 +1,10 @@
package com.njzscloud.common.mvc.support;
import cn.hutool.core.util.StrUtil;
import com.njzscloud.common.core.ienum.Dict;
import com.njzscloud.common.core.ienum.DictInt;
import com.njzscloud.common.core.ienum.DictStr;
import com.njzscloud.common.core.ienum.*;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
@ -16,6 +15,13 @@ import org.springframework.web.method.support.ModelAndViewContainer;
*/
@SuppressWarnings({"ConstantConditions"})
public class DictHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
{
DictItem dictItem = new DictItem()
.setKey("key")
.setVal("val")
.setTxt("txt");
DictItem.put("key", dictItem);
}
/**
* {@link DictInt} {@link DictStr}
@ -25,7 +31,8 @@ public class DictHandlerMethodArgumentResolver implements HandlerMethodArgumentR
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return DictInt.class.isAssignableFrom(parameter.getParameterType()) || DictStr.class.isAssignableFrom(parameter.getParameterType());
Class<?> parameterType = parameter.getParameterType();
return DictInt.class.isAssignableFrom(parameterType) || DictStr.class.isAssignableFrom(parameterType);
}
/**
@ -40,8 +47,14 @@ public class DictHandlerMethodArgumentResolver implements HandlerMethodArgumentR
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container, NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
String parameterName = parameter.getParameterName();
String param = request.getParameter(parameterName);
if (parameterName == null) {
RequestParam parameterAnnotation = parameter.getParameterAnnotation(RequestParam.class);
if (parameterAnnotation == null) return null;
parameterName = parameterAnnotation.value();
}
String param = request.getParameter(parameterName);
if (StrUtil.isBlank(param)) return null;
Class<?> type = parameter.getParameterType();
@ -51,8 +64,16 @@ public class DictHandlerMethodArgumentResolver implements HandlerMethodArgumentR
DictInt[] constants = (DictInt[]) type.getEnumConstants();
return Dict.parse(val, constants);
} else if (DictStr.class.isAssignableFrom(type)) {
if (type.isEnum()) {
DictStr[] constants = (DictStr[]) type.getEnumConstants();
return Dict.parse(param, constants);
} else {
if (StrUtil.isBlank(param)) return null;
DictKey annotation = parameter.getParameterAnnotation(DictKey.class);
if (annotation == null) return null;
String value = annotation.value();
return DictItem.get(value, param);
}
} else {
return null;
}

View File

@ -60,7 +60,9 @@ public class SecurityUtil {
* @param userDetail
*/
public static UserDetail registrationUser(UserDetail userDetail) {
SpringUtil.getBean(ITokenService.class).updateToken(userDetail);
Token token = Token.of(userDetail.getUserId(), userDetail.getAccountId(), userDetail.getAuthWay());
userDetail.setToken(token);
saveToken(userDetail);
return userDetail;
}
@ -69,11 +71,9 @@ public class SecurityUtil {
*
* @param userDetail
*/
public static UserDetail updateUser(UserDetail userDetail) {
Token token = Token.of(userDetail.getUserId(), userDetail.getAccountId(), userDetail.getAuthWay());
userDetail.setToken(token);
saveToken(userDetail);
return userDetail;
public static void updateUser(UserDetail userDetail) {
SpringUtil.getBean(ITokenService.class).updateToken(userDetail);
}
/**

View File

@ -93,6 +93,7 @@ public class AuthService implements IAuthService {
.setMenus(menuResources)
.setEndpoints(endpointResources)
.setRoles(roles)
.setClient(client)
;
}

View File

@ -0,0 +1,20 @@
package com.njzscloud.dispose.sys.dict.controller;
import com.njzscloud.common.core.ienum.DictItem;
import com.njzscloud.common.core.ienum.DictKey;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class Data {
@DictKey("key")
DictItem dictItem;
String a;
String b;
String e;
}

View File

@ -1,10 +1,12 @@
package com.njzscloud.dispose.sys.dict.controller;
import com.njzscloud.common.core.ienum.DictItem;
import com.njzscloud.common.core.ienum.DictKey;
import com.njzscloud.common.core.utils.R;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.dispose.sys.dict.pojo.DictEntity;
import com.njzscloud.dispose.sys.dict.pojo.ObtainDictDataResult;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictEntity;
import com.njzscloud.dispose.sys.dict.pojo.result.ObtainDictDataResult;
import com.njzscloud.dispose.sys.dict.service.DictService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -77,4 +79,22 @@ public class DictController {
}
/**
*
*/
@GetMapping("/a")
public R<?> a(@DictKey("key") @RequestParam("dictItem") DictItem dictItem) {
return R.success(dictItem);
}
/**
*
*/
@PostMapping("/b")
public R<?> b(@RequestBody Data data) {
return R.success(data);
}
}

View File

@ -3,7 +3,7 @@ package com.njzscloud.dispose.sys.dict.controller;
import com.njzscloud.common.core.utils.R;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.dispose.sys.dict.pojo.DictItemEntity;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictItemEntity;
import com.njzscloud.dispose.sys.dict.service.DictItemService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,7 +1,7 @@
package com.njzscloud.dispose.sys.dict.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njzscloud.dispose.sys.dict.pojo.DictItemEntity;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictItemEntity;
import org.apache.ibatis.annotations.Mapper;
/**

View File

@ -1,7 +1,7 @@
package com.njzscloud.dispose.sys.dict.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njzscloud.dispose.sys.dict.pojo.DictEntity;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictEntity;
import org.apache.ibatis.annotations.Mapper;
/**

View File

@ -1,4 +1,4 @@
package com.njzscloud.dispose.sys.dict.pojo;
package com.njzscloud.dispose.sys.dict.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -1,4 +1,4 @@
package com.njzscloud.dispose.sys.dict.pojo;
package com.njzscloud.dispose.sys.dict.pojo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -1,4 +1,4 @@
package com.njzscloud.dispose.sys.dict.pojo;
package com.njzscloud.dispose.sys.dict.pojo.result;
import lombok.Getter;
import lombok.Setter;

View File

@ -10,7 +10,7 @@ import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.dispose.sys.dict.mapper.DictItemMapper;
import com.njzscloud.dispose.sys.dict.pojo.DictItemEntity;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictItemEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

View File

@ -10,11 +10,11 @@ import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.dispose.sys.dict.mapper.DictMapper;
import com.njzscloud.dispose.sys.dict.pojo.DictEntity;
import com.njzscloud.dispose.sys.dict.pojo.DictItemEntity;
import com.njzscloud.dispose.sys.dict.pojo.ObtainDictDataResult;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictEntity;
import com.njzscloud.dispose.sys.dict.pojo.entity.DictItemEntity;
import com.njzscloud.dispose.sys.dict.pojo.result.ObtainDictDataResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -26,9 +26,9 @@ import java.util.stream.Collectors;
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class DictService extends ServiceImpl<DictMapper, DictEntity> implements IService<DictEntity> {
@Autowired
private DictItemService dictItemService;
private final DictItemService dictItemService;
/**
*
@ -84,7 +84,7 @@ public class DictService extends ServiceImpl<DictMapper, DictEntity> implements
.or().like(DictItemEntity::getVal, keywords)
.or().like(DictItemEntity::getMemo, keywords)
)
.orderByAsc(DictItemEntity::getSort, DictItemEntity::getVal)
.orderByAsc(DictItemEntity::getSort, DictItemEntity::getVal, DictItemEntity::getId)
)
.stream().map(it -> BeanUtil.copyProperties(it, ObtainDictDataResult.class))
.collect(Collectors.toList());

View File

@ -55,6 +55,7 @@ public class UserService extends ServiceImpl<UserMapper, UserEntity> implements
private final UserAccountService userAccountService;
private final UserRoleService userRoleService;
private final CustomerService customerService;
private final AuthService authService;
/**
*
@ -139,7 +140,6 @@ public class UserService extends ServiceImpl<UserMapper, UserEntity> implements
return PageResult.of(baseMapper.paging(pageParam.toPage(), ew));
}
AuthService authService;
/**
*

View File

@ -0,0 +1,20 @@
package a;
import com.njzscloud.common.core.ienum.DictItem;
import com.njzscloud.common.core.ienum.DictKey;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class Data {
@DictKey("key")
DictItem dictItem;
String a;
String b;
String e;
}