mirror of
https://github.com/hs-web/hsweb-framework.git
synced 2026-06-03 19:33:16 +08:00
Merge remote-tracking branch 'origin/master'
# Conflicts: # hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomCodecsAutoConfiguration.java
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) -> {
|
||||
|
||||
Reference in New Issue
Block a user