diff --git a/README.md b/README.md index 042721e90d9302a694836363f49ec6da4c535db9..15c7f1f00dc834b810446fd4aff997de96989d34 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ loc |代码行数统计 | https://github.com/cgag/loc ### 命令打包,跳过TEST ```shell script -./gradlew bootJar -x test +./gradlew clean bootJar -x test ``` ### 多模块构建,依赖关系解决 @@ -90,4 +90,6 @@ https://juejin.im/post/6844904196693557255 #### 自定义date的序列化器 -https://blog.csdn.net/bandancer/article/details/84926383 \ No newline at end of file +https://blog.csdn.net/bandancer/article/details/84926383 + +[基于fastjson在mvc中解决enum类型序列化反序列化](https://zhuanlan.zhihu.com/p/121112597) diff --git a/app/src/main/java/hxy/dream/app/controller/UserController.java b/app/src/main/java/hxy/dream/app/controller/UserController.java index 7b1ad44c4983f9294142716d5f1fe0f4db745fda..747ea70bd9d4fe6b54ffba564a25f76a0beaa04e 100644 --- a/app/src/main/java/hxy/dream/app/controller/UserController.java +++ b/app/src/main/java/hxy/dream/app/controller/UserController.java @@ -1,5 +1,6 @@ package hxy.dream.app.controller; +import hxy.dream.app.entity.param.UserDtoParam; import hxy.dream.app.entity.param.UserParam; import hxy.dream.app.service.UserService; import hxy.dream.common.converter.StringToEnumConverter; @@ -67,4 +68,12 @@ public class UserController { UserModel userModel = userService.add(userParam); return BaseResponseVO.success(userModel); } + + @PostMapping("add/dto") + public BaseResponseVO saveBodyDto(@Valid @RequestBody UserDtoParam userParam) { + log.debug("\n====>当前添加的用户信息是{}", userParam); + + return BaseResponseVO.success(userParam); + } + } diff --git a/app/src/main/java/hxy/dream/app/entity/param/UserDtoParam.java b/app/src/main/java/hxy/dream/app/entity/param/UserDtoParam.java new file mode 100644 index 0000000000000000000000000000000000000000..339d78f11584a78d83e1601f5e69579456975408 --- /dev/null +++ b/app/src/main/java/hxy/dream/app/entity/param/UserDtoParam.java @@ -0,0 +1,14 @@ +package hxy.dream.app.entity.param; + +import hxy.dream.entity.dto.UserDTO; +import hxy.dream.entity.enums.GenderEnum; +import lombok.Data; + +/** + * @author iris + */ +@Data +public class UserDtoParam { + UserDTO userDTO; + GenderEnum genderEnum; +} diff --git a/app/src/main/java/hxy/dream/app/entity/param/UserParam.java b/app/src/main/java/hxy/dream/app/entity/param/UserParam.java index f5ce435731a74644bb9c53328ec412603ca6961e..3042ab9b89cb350afe8fd53368cf0ff63aeb583c 100644 --- a/app/src/main/java/hxy/dream/app/entity/param/UserParam.java +++ b/app/src/main/java/hxy/dream/app/entity/param/UserParam.java @@ -1,5 +1,6 @@ package hxy.dream.app.entity.param; +import hxy.dream.entity.dto.UserDTO; import hxy.dream.entity.enums.GenderEnum; import lombok.Data; @@ -17,4 +18,6 @@ public class UserParam { GenderEnum gender; @NotNull(message = "age不能为空") Integer age; + + UserDTO userDTO; } diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 14c5712d3ef34932d43a9959a3c4f0afe62f1c9d..3f72de31b36172404732bcbe1394ca323993410d 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -4,6 +4,7 @@ import hxy.dream.app.entity.param.UserParam; import hxy.dream.app.service.UserService; import hxy.dream.dao.mapper.UserMapper; import hxy.dream.dao.modle.UserModel; +import hxy.dream.entity.dto.UserDTO; import hxy.dream.entity.enums.GenderEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -32,6 +33,9 @@ public class UserServiceImpl implements UserService { } int insert = userMapper.insert(userModel); log.debug("\n====>插入影响行数:{}", insert); + UserDTO userDTO = new UserDTO(); + userDTO.setId("111"); + userModel.setUserDTO(userDTO); return userModel; } diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index e0e35b51a70b30f2579d63345535f4329960f92e..f29beb9582415bd5d466b661e928c967384af286 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -1,7 +1,7 @@ GET http://localhost:8080/get/12 ### 添加 -POST http://localhost:8080/user/add/ +POST http://localhost:8080/user/add/body Content-Type: application/json Accept: application/json @@ -19,4 +19,4 @@ Accept: application/json ### 列表 -GET http://localhost:8080/list \ No newline at end of file +GET http://localhost:8080/user/list \ No newline at end of file diff --git "a/asset/img/findCustomEnumDeserializer by interfaces by aohanhongzhi \302\267 Pull Request #2842 \302\267 FasterXML_jackson-databind.pdf" "b/asset/img/findCustomEnumDeserializer by interfaces by aohanhongzhi \302\267 Pull Request #2842 \302\267 FasterXML_jackson-databind.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..2e1c8221e0c27daaad27a20efdc3b9feb0b6bf82 Binary files /dev/null and "b/asset/img/findCustomEnumDeserializer by interfaces by aohanhongzhi \302\267 Pull Request #2842 \302\267 FasterXML_jackson-databind.pdf" differ diff --git a/asset/img/github.com_FasterXML_jackson-databind_pull_2842.png b/asset/img/github.com_FasterXML_jackson-databind_pull_2842.png new file mode 100644 index 0000000000000000000000000000000000000000..b5697e36359f1e354724fa01d1c2ce849cea958e Binary files /dev/null and b/asset/img/github.com_FasterXML_jackson-databind_pull_2842.png differ diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index f3a797007b5a1cafb685a6d51f62cd385b95f45a..0238e1fcbbce3aec359d6357727b2b9413df309b 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -9,15 +9,21 @@ package hxy.dream.common.configuration; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; import hxy.dream.common.serializer.BaseEnumDeserializer; import hxy.dream.common.serializer.BaseEnumSerializer; +import hxy.dream.common.serializer.DTOSerializer; import hxy.dream.common.serializer.DateJsonSerializer; +import hxy.dream.common.serializer.SimpleDeserializersWrapper; +import hxy.dream.entity.dto.DTO; import hxy.dream.entity.enums.BaseEnum; import hxy.dream.entity.enums.GenderEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.util.Date; import java.util.LinkedHashMap; @@ -33,10 +39,13 @@ public class BeanConfig { // 自定义序列化器注入 Map, JsonSerializer> serializers = new LinkedHashMap<>(); serializers.put(BaseEnum.class, new BaseEnumSerializer()); - serializers.put(Date.class, new DateJsonSerializer()); +// serializers.put(Enum.class, new BaseEnumSerializer()); +// serializers.put(GenderEnum.class, new BaseEnumSerializer()); +// serializers.put(Date.class, new DateJsonSerializer()); +// serializers.put(DTO.class, new DTOSerializer()); jacksonObjectMapperBuilder.serializersByType(serializers); -// 自定义反序列化器注入 +// 自定义反序列化器注入,这里的注入貌似效果不行 Map, JsonDeserializer> deserializers = new LinkedHashMap<>(); deserializers.put(BaseEnum.class, new BaseEnumDeserializer()); // deserializers.put(GenderEnum.class, new BaseEnumDeserializer()); @@ -44,4 +53,18 @@ public class BeanConfig { }; } + + @Bean + public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { + SimpleDeserializersWrapper deserializers = new SimpleDeserializersWrapper(); + deserializers.addDeserializer(BaseEnum.class, new BaseEnumDeserializer()); + + SimpleModule simpleModule = new SimpleModule(); + simpleModule.setDeserializers(deserializers); + simpleModule.addSerializer(BaseEnum.class, new BaseEnumSerializer()); + + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + objectMapper.registerModule(simpleModule); + return objectMapper; + } } diff --git a/common/src/main/java/hxy/dream/common/serializer/DTOSerializer.java b/common/src/main/java/hxy/dream/common/serializer/DTOSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..3d1f026ec8ec3188f7714a3628e4677cf3fd8846 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/serializer/DTOSerializer.java @@ -0,0 +1,23 @@ +package hxy.dream.common.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import hxy.dream.entity.dto.DTO; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; + +@Slf4j +public class DTOSerializer extends JsonSerializer { + + @Override + public void serialize(DTO value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + + String dto = value.dto(); + log.info("\n====>当前是DTO序列化[{}]", dto); + gen.writeStartObject(); + gen.writeStringField("dto", dto); + gen.writeEndObject(); + } +} diff --git a/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java b/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..62a99e2d08205e1b9a8da8a02de6c8603e011e4b --- /dev/null +++ b/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java @@ -0,0 +1,33 @@ +package hxy.dream.common.serializer; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.DeserializationConfig; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.module.SimpleDeserializers; +import com.fasterxml.jackson.databind.type.ClassKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SimpleDeserializersWrapper extends SimpleDeserializers { + + static final Logger logger = LoggerFactory.getLogger(SimpleDeserializersWrapper.class); + @Override + public JsonDeserializer findEnumDeserializer(Class type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException { + + JsonDeserializer enumDeserializer = super.findEnumDeserializer(type, config, beanDesc); + if (enumDeserializer != null) { + return enumDeserializer; + } + logger.info("\n重写枚举查找逻辑"); + for (Class typeInterface : type.getInterfaces()) { + enumDeserializer = this._classMappings.get(new ClassKey(typeInterface)); + if (enumDeserializer != null) { + return enumDeserializer; + } + } + return null; + +// return super.findEnumDeserializer(type, config, beanDesc); + } +} diff --git a/dao/src/main/java/hxy/dream/dao/modle/UserModel.java b/dao/src/main/java/hxy/dream/dao/modle/UserModel.java index 2905f0a14e80b183a7d2eedd0348ba7e3081ca5c..2db217713f2bd1807b14f76c10b383743526747b 100644 --- a/dao/src/main/java/hxy/dream/dao/modle/UserModel.java +++ b/dao/src/main/java/hxy/dream/dao/modle/UserModel.java @@ -1,9 +1,11 @@ package hxy.dream.dao.modle; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; +import hxy.dream.entity.dto.UserDTO; import hxy.dream.entity.enums.GenderEnum; import lombok.Data; import lombok.EqualsAndHashCode; @@ -18,4 +20,6 @@ public class UserModel extends Model { Integer age; GenderEnum gender; String password; + @TableField(exist = false) + UserDTO userDTO; } diff --git a/entity/src/main/java/hxy/dream/entity/dto/DTO.java b/entity/src/main/java/hxy/dream/entity/dto/DTO.java new file mode 100644 index 0000000000000000000000000000000000000000..3e2cce0eaf709d82e40232528175e0d0c8bdb520 --- /dev/null +++ b/entity/src/main/java/hxy/dream/entity/dto/DTO.java @@ -0,0 +1,5 @@ +package hxy.dream.entity.dto; + +public interface DTO { + String dto(); +} diff --git a/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java b/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java index 1d3e8532f2ff4307ccbdd05f47bb4629743155de..00b72fd8f79fa2a1f49d348a8915546900382071 100644 --- a/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java +++ b/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java @@ -1,6 +1,15 @@ package hxy.dream.entity.dto; -public class UserDTO { +import lombok.Data; + +@Data +public class UserDTO implements DTO { String id; - Enum gender; +// GenderEnum gender; + + @Override + public String dto() { + + return id; + } } diff --git a/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java b/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java index a8583c8803cd8fc033235efbfd071222dd90d48c..cb60938bf0b3b67fb63a35e9ab403fb739b57047 100644 --- a/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java +++ b/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java @@ -20,5 +20,4 @@ public interface BaseEnum { */ String description(); - BaseEnum getByCode(Integer code); } \ No newline at end of file diff --git a/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java b/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java index d76c264823b9b7e27ba6f3238d6592045281bda8..bc2ea90bf777e0ce0e0d55ad02fbad1351fe06b3 100644 --- a/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java +++ b/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java @@ -9,8 +9,11 @@ import lombok.Getter; @Getter public enum GenderEnum implements BaseEnum { BOY(100, "男"), GIRL(200, "女"),UNKNOWN(0, "未知"); + + @EnumValue//标记数据库存的值是code private final Integer code; + private final String description; GenderEnum(int code, String description) { @@ -39,10 +42,6 @@ public enum GenderEnum implements BaseEnum { return description; } - @Override - public BaseEnum getByCode(Integer code) { - return null; - } // @JsonCreator // public static GenderEnum getItem(int code){