Merge remote-tracking branch 'origin/master'

# Conflicts:
#	hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomCodecsAutoConfiguration.java
This commit is contained in:
zhou-hao
2021-06-24 08:52:43 +08:00
4 changed files with 73 additions and 23 deletions

View File

@@ -16,6 +16,8 @@ import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.hswebframework.web.exception.ValidationException;
@@ -25,6 +27,7 @@ import org.springframework.util.StringUtils;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -123,11 +126,6 @@ public interface EnumDict<V> extends JSONSerializable {
return getText();
}
@JsonCreator
default EnumDict<V> fromJsonNode(Object val) {
return null;
}
/**
@@ -294,7 +292,10 @@ public interface EnumDict<V> extends JSONSerializable {
* 自定义fastJson枚举序列化
*/
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
class EnumDictJSONDeserializer extends JsonDeserializer implements ObjectDeserializer {
private Function<Object,Object> mapper;
@Override
@SuppressWarnings("all")
@@ -346,7 +347,14 @@ public interface EnumDict<V> extends JSONSerializable {
@SneakyThrows
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
if(mapper!=null){
if(node.isTextual()){
return mapper.apply(node.asText());
}
if(node.isNumber()){
return mapper.apply(node.asLong());
}
}
String currentName = jp.currentName();
Object currentValue = jp.getCurrentValue();
Class findPropertyType;

View File

@@ -1,14 +1,19 @@
package org.hswebframework.web.dict;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.EnumDeserializer;
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.ClassKey;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
import org.junit.Assert;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;
public class EnumDictTest {
@@ -18,8 +23,22 @@ public class EnumDictTest {
public void testJackson() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
JsonDeserializer<EnumDict> deserialize = new EnumDict.EnumDictJSONDeserializer();
module.addDeserializer(Enum.class, (JsonDeserializer) deserialize);
module.setDeserializers(new SimpleDeserializers() {
@Override
public JsonDeserializer<?> findEnumDeserializer(Class<?> type,
DeserializationConfig config,
BeanDescription beanDesc) throws JsonMappingException {
JsonDeserializer<?> deser = null;
if (type.isEnum()) {
if (EnumDict.class.isAssignableFrom(type)) {
deser = new EnumDict.EnumDictJSONDeserializer(val -> EnumDict
.find((Class) type, val)
.orElse(null));
}
}
return deser;
}
});
mapper.registerModule(module);
@@ -40,6 +59,11 @@ public class EnumDictTest {
System.out.println((Object) mapper.readerFor(TestEnum.class).readValue("\"E1\""));
testEntity = mapper.readerFor(TestEntity.class)
.readValue("{\"testEnums\":[\"E1\"]}");
// System.out.println(testEntity.getTestEnums());
Assert.assertArrayEquals(testEntity.getTestEnums(), new TestEnum[]{TestEnum.E1});
}
@Test
@@ -49,9 +73,11 @@ public class EnumDictTest {
assertTrue(EnumDict.find(TestEnum.class, "e1")
.isPresent());
assertTrue(EnumDict.find(TestEnum.class, "E1")
.isPresent());
}
@Getter
@@ -60,6 +86,8 @@ public class EnumDictTest {
private TestEnum testEnum = TestEnum.E1;
private SimpleEnum simpleEnum = SimpleEnum.A;
private TestEnum[] testEnums;
}
public enum SimpleEnum {

View File

@@ -1,7 +1,6 @@
package org.hswebframework.web.dict;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Getter;

View File

@@ -1,8 +1,10 @@
package org.hswebframework.web.starter.jackson;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.std.EnumDeserializer;
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.ClassKey;
import org.hswebframework.web.api.crud.entity.EntityFactory;
import org.hswebframework.web.dict.EnumDict;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -23,16 +25,29 @@ public class CustomCodecsAutoConfiguration {
@ConditionalOnClass(ObjectMapper.class)
static class JacksonDecoderConfiguration {
@Bean
@Order(1)
@ConditionalOnBean(ObjectMapper.class)
CodecCustomizer jacksonDecoderCustomizer(EntityFactory entityFactory, ObjectMapper objectMapper) {
// objectMapper.setTypeFactory(new CustomTypeFactory(entityFactory));
SimpleModule module = new SimpleModule();
@SuppressWarnings("all")
JsonDeserializer<Enum<?>> deserializer = new EnumDict.EnumDictJSONDeserializer();
module.addDeserializer(Enum.class, deserializer);
objectMapper.registerModule(module);
@Bean
@Order(1)
@ConditionalOnBean(ObjectMapper.class)
CodecCustomizer jacksonDecoderCustomizer(EntityFactory entityFactory, ObjectMapper objectMapper) {
// objectMapper.setTypeFactory(new CustomTypeFactory(entityFactory));
SimpleModule module = new SimpleModule();
module.setDeserializers(new SimpleDeserializers() {
@Override
public JsonDeserializer<?> findEnumDeserializer(Class<?> type,
DeserializationConfig config,
BeanDescription beanDesc) {
JsonDeserializer<?> deser = null;
if (type.isEnum()) {
if (EnumDict.class.isAssignableFrom(type)) {
deser = new EnumDict.EnumDictJSONDeserializer(val -> EnumDict
.find((Class) type, val)
.orElse(null));
}
}
return deser;
}
});
objectMapper.registerModule(module);
return (configurer) -> {