From 0ed7edfd25d4c81f86eca0375e457669b6cba1bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Mon, 26 Oct 2020 19:58:02 +0800 Subject: [PATCH] mixin support jsoncreator --- .../alibaba/fastjson/util/JavaBeanInfo.java | 19 ++++++++++++++++++- .../json/bvt/issue_3400/Issue3436.java | 3 --- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/fastjson/util/JavaBeanInfo.java b/src/main/java/com/alibaba/fastjson/util/JavaBeanInfo.java index def0dfa3a..8e85ce3dd 100644 --- a/src/main/java/com/alibaba/fastjson/util/JavaBeanInfo.java +++ b/src/main/java/com/alibaba/fastjson/util/JavaBeanInfo.java @@ -7,6 +7,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.PropertyNamingStrategy; import com.alibaba.fastjson.annotation.JSONCreator; @@ -315,7 +316,23 @@ public class JavaBeanInfo { boolean isInterfaceOrAbstract = clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers()); if ((defaultConstructor == null && builderClass == null) || isInterfaceOrAbstract) { - creatorConstructor = getCreatorConstructor(constructors); + + Type mixInType = JSON.getMixInAnnotations(clazz); + if (mixInType instanceof Class) { + Constructor[] mixInConstructors = ((Class) mixInType).getConstructors(); + Constructor mixInCreator = getCreatorConstructor(mixInConstructors); + if (mixInCreator != null) { + try { + creatorConstructor = clazz.getConstructor(mixInCreator.getParameterTypes()); + } catch (NoSuchMethodException e) { + // skip + } + } + } + + if (creatorConstructor == null) { + creatorConstructor = getCreatorConstructor(constructors); + } if (creatorConstructor != null && !isInterfaceOrAbstract) { // 基于标记 JSONCreator 注解的构造方法 TypeUtils.setAccessible(creatorConstructor); diff --git a/src/test/java/com/alibaba/json/bvt/issue_3400/Issue3436.java b/src/test/java/com/alibaba/json/bvt/issue_3400/Issue3436.java index 4fca321d2..8a6171919 100644 --- a/src/test/java/com/alibaba/json/bvt/issue_3400/Issue3436.java +++ b/src/test/java/com/alibaba/json/bvt/issue_3400/Issue3436.java @@ -3,12 +3,9 @@ package com.alibaba.json.bvt.issue_3400; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.annotation.JSONCreator; import com.alibaba.fastjson.annotation.JSONType; -import com.alibaba.fastjson.serializer.SerializeConfig; import junit.framework.TestCase; import org.springframework.core.io.FileSystemResource; -import java.util.HashMap; - public class Issue3436 extends TestCase { public void test_for_issue() throws Exception { JSON.addMixInAnnotations(FileSystemResource.class, FileSystemResourceMixedIn.class);