diff --git a/core/pom.xml b/core/pom.xml index 800029a96..700ccdcfc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -173,6 +173,12 @@ springfox-spring-web test + + jakarta.validation + jakarta.validation-api + 2.0.2 + test + javax.money money-api diff --git a/core/src/main/java/com/alibaba/fastjson2/filter/ContextAutoTypeBeforeHandler.java b/core/src/main/java/com/alibaba/fastjson2/filter/ContextAutoTypeBeforeHandler.java index 765adb0bf..0d4d8534d 100644 --- a/core/src/main/java/com/alibaba/fastjson2/filter/ContextAutoTypeBeforeHandler.java +++ b/core/src/main/java/com/alibaba/fastjson2/filter/ContextAutoTypeBeforeHandler.java @@ -23,122 +23,6 @@ import static com.alibaba.fastjson2.util.TypeUtils.*; public class ContextAutoTypeBeforeHandler implements JSONReader.AutoTypeBeforeHandler { - static final Class[] BASIC_TYPES = { - Object.class, - byte.class, - Byte.class, - short.class, - Short.class, - int.class, - Integer.class, - long.class, - Long.class, - float.class, - Float.class, - double.class, - Double.class, - - Number.class, - BigInteger.class, - BigDecimal.class, - - AtomicInteger.class, - AtomicLong.class, - AtomicBoolean.class, - AtomicIntegerArray.class, - AtomicLongArray.class, - AtomicReference.class, - - boolean.class, - Boolean.class, - char.class, - Character.class, - - String.class, - UUID.class, - Currency.class, - BitSet.class, - EnumSet.class, - // this is java.util.RegularEnumSet, java.util.JumboEnumSet need add manually ? - EnumSet.noneOf(TimeUnit.class).getClass(), - - Date.class, - Calendar.class, - LocalTime.class, - LocalDate.class, - LocalDateTime.class, - Instant.class, - SimpleDateFormat.class, - DateTimeFormatter.class, - TimeUnit.class, - - Set.class, - HashSet.class, - LinkedHashSet.class, - TreeSet.class, - List.class, - ArrayList.class, - LinkedList.class, - ConcurrentLinkedQueue.class, - ConcurrentSkipListSet.class, - CopyOnWriteArrayList.class, - - Collections.emptyList().getClass(), - Collections.emptyMap().getClass(), - CLASS_SINGLE_SET, - CLASS_SINGLE_LIST, - CLASS_UNMODIFIABLE_COLLECTION, - CLASS_UNMODIFIABLE_LIST, - CLASS_UNMODIFIABLE_SET, - CLASS_UNMODIFIABLE_SORTED_SET, - CLASS_UNMODIFIABLE_NAVIGABLE_SET, - Collections.unmodifiableMap(new HashMap<>()).getClass(), - Collections.unmodifiableNavigableMap(new TreeMap<>()).getClass(), - Collections.unmodifiableSortedMap(new TreeMap<>()).getClass(), - Arrays.asList().getClass(), - - Map.class, - HashMap.class, - Hashtable.class, - TreeMap.class, - LinkedHashMap.class, - WeakHashMap.class, - IdentityHashMap.class, - ConcurrentMap.class, - ConcurrentHashMap.class, - ConcurrentSkipListMap.class, - - Exception.class, - IllegalAccessError.class, - IllegalAccessException.class, - IllegalArgumentException.class, - IllegalMonitorStateException.class, - IllegalStateException.class, - IllegalThreadStateException.class, - IndexOutOfBoundsException.class, - InstantiationError.class, - InstantiationException.class, - InternalError.class, - InterruptedException.class, - LinkageError.class, - NegativeArraySizeException.class, - NoClassDefFoundError.class, - NoSuchFieldError.class, - NoSuchFieldException.class, - NoSuchMethodError.class, - NoSuchMethodException.class, - NullPointerException.class, - NumberFormatException.class, - OutOfMemoryError.class, - RuntimeException.class, - SecurityException.class, - StackOverflowError.class, - StringIndexOutOfBoundsException.class, - TypeNotPresentException.class, - VerifyError.class, - StackTraceElement.class - }; - final long[] acceptHashCodes; final ConcurrentMap> tclHashCaches = new ConcurrentHashMap<>(); final Map classCache = new ConcurrentHashMap<>(16, 0.75f, 1); @@ -180,10 +64,134 @@ public class ContextAutoTypeBeforeHandler public ContextAutoTypeBeforeHandler(boolean includeBasic, String... acceptNames) { Set nameSet = new HashSet<>(); if (includeBasic) { - for (Class basicType : BASIC_TYPES) { + Class[] basicTypes = { + Object.class, + byte.class, + Byte.class, + short.class, + Short.class, + int.class, + Integer.class, + long.class, + Long.class, + float.class, + Float.class, + double.class, + Double.class, + + Number.class, + BigInteger.class, + BigDecimal.class, + + AtomicInteger.class, + AtomicLong.class, + AtomicBoolean.class, + AtomicIntegerArray.class, + AtomicLongArray.class, + AtomicReference.class, + + boolean.class, + Boolean.class, + char.class, + Character.class, + + String.class, + UUID.class, + Currency.class, + BitSet.class, + EnumSet.class, + // this is java.util.RegularEnumSet, java.util.JumboEnumSet need add manually ? + EnumSet.noneOf(TimeUnit.class).getClass(), + + Date.class, + Calendar.class, + LocalTime.class, + LocalDate.class, + LocalDateTime.class, + Instant.class, + SimpleDateFormat.class, + DateTimeFormatter.class, + TimeUnit.class, + + Set.class, + HashSet.class, + LinkedHashSet.class, + TreeSet.class, + List.class, + ArrayList.class, + LinkedList.class, + ConcurrentLinkedQueue.class, + ConcurrentSkipListSet.class, + CopyOnWriteArrayList.class, + + Collections.emptyList().getClass(), + Collections.emptyMap().getClass(), + CLASS_SINGLE_SET, + CLASS_SINGLE_LIST, + CLASS_UNMODIFIABLE_COLLECTION, + CLASS_UNMODIFIABLE_LIST, + CLASS_UNMODIFIABLE_SET, + CLASS_UNMODIFIABLE_SORTED_SET, + CLASS_UNMODIFIABLE_NAVIGABLE_SET, + Collections.unmodifiableMap(new HashMap<>()).getClass(), + Collections.unmodifiableNavigableMap(new TreeMap<>()).getClass(), + Collections.unmodifiableSortedMap(new TreeMap<>()).getClass(), + Arrays.asList().getClass(), + + Map.class, + HashMap.class, + Hashtable.class, + TreeMap.class, + LinkedHashMap.class, + WeakHashMap.class, + IdentityHashMap.class, + ConcurrentMap.class, + ConcurrentHashMap.class, + ConcurrentSkipListMap.class, + + Exception.class, + IllegalAccessError.class, + IllegalAccessException.class, + IllegalArgumentException.class, + IllegalMonitorStateException.class, + IllegalStateException.class, + IllegalThreadStateException.class, + IndexOutOfBoundsException.class, + InstantiationError.class, + InstantiationException.class, + InternalError.class, + InterruptedException.class, + LinkageError.class, + NegativeArraySizeException.class, + NoClassDefFoundError.class, + NoSuchFieldError.class, + NoSuchFieldException.class, + NoSuchMethodError.class, + NoSuchMethodException.class, + NullPointerException.class, + NumberFormatException.class, + OutOfMemoryError.class, + RuntimeException.class, + SecurityException.class, + StackOverflowError.class, + StringIndexOutOfBoundsException.class, + TypeNotPresentException.class, + VerifyError.class, + StackTraceElement.class + }; + + for (Class basicType : basicTypes) { String name = TypeUtils.getTypeName(basicType); nameSet.add(name); } + + String[] basicTypeNames = { + "javax.validation.ValidationException", + "javax.validation.NoProviderFoundException" + }; + for (String basicType : basicTypeNames) { + nameSet.add(basicType); + } } for (String name : acceptNames) { diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_1000/Issue1485.java b/core/src/test/java/com/alibaba/fastjson2/issues_1000/Issue1485.java new file mode 100644 index 000000000..5c7f81794 --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues_1000/Issue1485.java @@ -0,0 +1,34 @@ +package com.alibaba.fastjson2.issues_1000; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.filter.ContextAutoTypeBeforeHandler; +import org.junit.jupiter.api.Test; + +import javax.validation.NoProviderFoundException; +import javax.validation.ValidationException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue1485 { + @Test + public void test() { + ContextAutoTypeBeforeHandler typeFilter = new ContextAutoTypeBeforeHandler(true); + assertEquals( + NoProviderFoundException.class, + typeFilter.apply("javax.validation.NoProviderFoundException", Object.class, JSONReader.Feature.SupportAutoType.mask) + ); + assertEquals( + ValidationException.class, + typeFilter.apply("javax.validation.ValidationException", Object.class, JSONReader.Feature.SupportAutoType.mask) + ); + + assertEquals( + NoProviderFoundException.class, + typeFilter.apply("javax.validation.NoProviderFoundException", Exception.class, 0) + ); + assertEquals( + ValidationException.class, + typeFilter.apply("javax.validation.ValidationException", Exception.class, 0) + ); + } +}