Skip to content

Commit 2961480

Browse files
committed
fix
1 parent 679c3d2 commit 2961480

3 files changed

Lines changed: 131 additions & 60 deletions

File tree

README.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,29 @@ public interface UserRemote extends UserApi {
8585
```
8686

8787
#### 指定方法返回值
88+
89+
可自定义构造 Fallback 中方法的返回值,支持基本类型、构造方法、静态方法,参数将会自动匹配出合适的方法。
90+
91+
1. 基本类型
92+
```
93+
@FeignReturn(target = boolean.class, params = ["ture"])
94+
@FallbackFactoryBuild
95+
@FeignClient(name = "user")
96+
public interface UserRemote extends UserApi {
97+
}
98+
99+
...
100+
101+
public interface UserRemote extends UserApi {
102+
103+
public Boolean deleteUser(@RequestBody UserRequest data) {
104+
return true
105+
}
106+
}
107+
108+
```
109+
110+
2. 构造函数
88111
```
89112
@FeignReturn(target = Result.class, staticMethod = "error", params = ["500", "msg"])
90113
@FallbackFactoryBuild
@@ -94,6 +117,25 @@ public interface UserRemote extends UserApi {
94117
95118
...
96119
120+
public interface UserRemote extends UserApi {
121+
122+
public Result<Boolean> deleteUser(@RequestBody UserRequest data) {
123+
return new Result.error();
124+
}
125+
}
126+
127+
```
128+
129+
3. 静态方法
130+
131+
```
132+
@FeignReturn(target = Result.class, staticMethod = "error", params = ["500", "msg"])
133+
@FallbackFactoryBuild
134+
@FeignClient(name = "user")
135+
public interface UserRemote extends UserApi {
136+
}
137+
138+
...
97139
98140
public interface UserRemote extends UserApi {
99141

src/main/java/io/moyada/feign/help/annotation/FeignReturn.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@
3030
* 默认返回空构造方法对象
3131
* @return 返回值的构造数据
3232
*/
33-
String[] params();
33+
String[] params() default {};
3434
}

src/main/java/io/moyada/feign/help/entity/ReturnBuild.java

Lines changed: 88 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,19 @@ public JCTree.JCReturn getReturn(JCTree.JCClassDecl classDecl) {
2929
if (returnAttr == null) {
3030
return null;
3131
}
32+
3233
String target = TreeUtil.getAnnotationValue(classDecl.sym, FeignReturn.class.getName(), "target()");
34+
if (TypeUtil.isPrimitive(target) || TypeUtil.isStr(target)) {
35+
if (returnAttr.params().length != 1) {
36+
throw new RuntimeException("FeignReturn params() size error: " + target);
37+
}
38+
39+
TypeTag baseType = TypeUtil.getBaseType(target);
40+
Object data = TreeUtil.getValue(baseType, returnAttr.params()[0]);
41+
JCTree.JCExpression argsVal = syntaxTreeMaker.newElement(baseType, data);
42+
return syntaxTreeMaker.getTreeMaker().Return(argsVal);
43+
}
44+
3345
Symbol.ClassSymbol targetClass = syntaxTreeMaker.getTypeElement(target);
3446
if (targetClass == null) {
3547
throw new RuntimeException("FeignReturn target() cannot be found: " + target);
@@ -44,60 +56,43 @@ public JCTree.JCReturn getReturn(JCTree.JCClassDecl classDecl) {
4456

4557
private JCTree.JCReturn constMethod(String className, Symbol.ClassSymbol targetClass, String[] params) {
4658
// 类构造方法
47-
List<JCTree.JCExpression> paramType = getParamType(targetClass, true, params);
48-
if (null == paramType) {
59+
List<JCTree.JCExpression> paramList = getConstParam(targetClass, params);
60+
if (null == paramList) {
4961
// 无匹配的构造方法
5062
throw new RuntimeException("[Return Error] Can't find match param constructor from " + className + " by " + Arrays.toString(params));
5163
}
52-
JCTree.JCExpression jcExpression = syntaxTreeMaker.NewObject(className, paramType);
64+
JCTree.JCExpression jcExpression = syntaxTreeMaker.NewObject(className, paramList);
5365
return syntaxTreeMaker.getTreeMaker().Return(jcExpression);
5466
}
5567

5668
private JCTree.JCReturn staticMethod(String className, Symbol.ClassSymbol targetClass, String staticMethod, String[] params) {
57-
List<JCTree.JCExpression> paramType;
69+
List<JCTree.JCExpression> paramList;
5870
if (params.length == 0) {
59-
paramType = TreeUtil.emptyExpression();
71+
paramList = TreeUtil.emptyExpression();
6072
} else {
61-
paramType = getParamType(targetClass, false, params);
62-
if (null == paramType) {
73+
paramList = getStaticParam(targetClass, params);
74+
if (null == paramList) {
6375
// 无匹配的静态方法
6476
throw new RuntimeException("[Return Error] Can't find match param static method from " + className + " by " + Arrays.toString(params));
6577
}
6678
}
6779

6880
JCTree.JCExpression clazzType = syntaxTreeMaker.findClass(className);
69-
JCTree.JCMethodInvocation method = syntaxTreeMaker.getMethod(clazzType, staticMethod, paramType);
81+
JCTree.JCMethodInvocation method = syntaxTreeMaker.getMethod(clazzType, staticMethod, paramList);
7082
return syntaxTreeMaker.getTreeMaker().Return(method);
7183
}
7284

7385
/**
7486
* 参数转换
7587
* @param classSymbol 解析类节点
76-
* @param isConstruct 解析构造方法还是静态方法
7788
* @param values 参数数据
7889
* @return 返回对应参数元素
7990
*/
80-
private List<JCTree.JCExpression> getParamType(Symbol.ClassSymbol classSymbol, boolean isConstruct, String[] values) {
81-
int length = values.length;
82-
83-
List<JCTree.JCExpression> param = null;
84-
85-
boolean findParam;
91+
private List<JCTree.JCExpression> getConstParam(Symbol.ClassSymbol classSymbol, String[] values) {
8692
for (Symbol element : classSymbol.getEnclosedElements()) {
87-
8893
// 构造方法
89-
if (isConstruct) {
90-
if (!element.isConstructor()) {
91-
continue;
92-
}
93-
} else {
94-
// 静态方法
95-
if (element.getKind() != ElementKind.METHOD) {
96-
continue;
97-
}
98-
if (!element.isStatic()) {
99-
continue;
100-
}
94+
if (!element.isConstructor()) {
95+
continue;
10196
}
10297

10398
Symbol.MethodSymbol methodSymbol = (Symbol.MethodSymbol) element;
@@ -108,44 +103,78 @@ private List<JCTree.JCExpression> getParamType(Symbol.ClassSymbol classSymbol, b
108103
continue;
109104
}
110105

111-
findParam = true;
112-
for (int i = 0; findParam && i < length; i++) {
113-
Symbol.VarSymbol varSymbol = parameters.get(i);
114-
String value = values[i];
115-
116-
String typeName = TreeUtil.getOriginalTypeName(varSymbol);
117-
TypeTag baseType = TypeUtil.getBaseType(typeName);
118-
119-
JCTree.JCExpression argsVal;
120-
121-
// 不支持复杂对象
122-
if (null == baseType) {
123-
param = null;
124-
findParam = false;
125-
continue;
126-
}
127-
128-
Object data = TreeUtil.getValue(baseType, value);
129-
// 数据与类型不匹配
130-
if (null == data) {
131-
param = null;
132-
findParam = false;
133-
continue;
134-
}
135-
argsVal = syntaxTreeMaker.newElement(baseType, data);
136-
137-
if (null == param) {
138-
param = List.of(argsVal);
139-
} else {
140-
param = param.append(argsVal);
141-
}
106+
if (values.length == 0) {
107+
return List.<JCTree.JCExpression>nil();
108+
}
109+
110+
List<JCTree.JCExpression> param = getParam(parameters, values);
111+
if (param != null) {
112+
return param;
113+
}
114+
}
115+
return null;
116+
}
117+
118+
119+
/**
120+
* 参数转换
121+
* @param classSymbol 解析类节点
122+
* @param values 参数数据
123+
* @return 返回对应参数元素
124+
*/
125+
private List<JCTree.JCExpression> getStaticParam(Symbol.ClassSymbol classSymbol, String[] values) {
126+
for (Symbol element : classSymbol.getEnclosedElements()) {
127+
// 静态方法
128+
if (element.getKind() != ElementKind.METHOD || !element.isStatic()) {
129+
continue;
130+
}
131+
132+
Symbol.MethodSymbol methodSymbol = (Symbol.MethodSymbol) element;
133+
List<Symbol.VarSymbol> parameters = methodSymbol.getParameters();
134+
135+
// 参数个数一致
136+
if (parameters.size() != values.length) {
137+
continue;
138+
}
139+
if (values.length == 0) {
140+
return List.<JCTree.JCExpression>nil();
142141
}
143142

143+
List<JCTree.JCExpression> param = getParam(parameters, values);
144144
if (param != null) {
145145
return param;
146146
}
147147
}
148+
return null;
149+
}
150+
151+
private List<JCTree.JCExpression> getParam(List<Symbol.VarSymbol> parameters, String[] values) {
152+
List<JCTree.JCExpression> param = null;
153+
for (int i = 0; i < parameters.size(); i++) {
154+
Symbol.VarSymbol varSymbol = parameters.get(i);
155+
String value = values[i];
156+
157+
String typeName = TreeUtil.getOriginalTypeName(varSymbol);
158+
TypeTag baseType = TypeUtil.getBaseType(typeName);
159+
160+
// 不支持复杂对象
161+
if (null == baseType) {
162+
return null;
163+
}
164+
165+
Object data = TreeUtil.getValue(baseType, value);
166+
// 数据与类型不匹配
167+
if (null == data) {
168+
return null;
169+
}
148170

171+
JCTree.JCExpression argsVal = syntaxTreeMaker.newElement(baseType, data);
172+
if (null == param) {
173+
param = List.of(argsVal);
174+
} else {
175+
param = param.append(argsVal);
176+
}
177+
}
149178
return null;
150179
}
151180
}

0 commit comments

Comments
 (0)