Skip to content

Commit 62a62e2

Browse files
authored
Merge pull request #1093 from harawata/constructor-args-resolution-bug
When resolving constructor args, @param should precede actual name even when useActualParamName is enabled.
2 parents ca7e977 + aca4eed commit 62a62e2

File tree

2 files changed

+22
-17
lines changed
  • src
    • main/java/org/apache/ibatis/mapping
    • test/java/org/apache/ibatis/submitted/named_constructor_args

2 files changed

+22
-17
lines changed

src/main/java/org/apache/ibatis/mapping/ResultMap.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -185,24 +185,29 @@ private boolean argTypesMatch(final List<String> constructorArgNames,
185185
}
186186

187187
private List<String> getArgNames(Constructor<?> constructor) {
188-
if (resultMap.configuration.isUseActualParamName() && Jdk.parameterExists) {
189-
return ParamNameUtil.getParamNames(constructor);
190-
} else {
191-
List<String> paramNames = new ArrayList<String>();
192-
final Annotation[][] paramAnnotations = constructor.getParameterAnnotations();
193-
int paramCount = paramAnnotations.length;
194-
for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {
195-
String name = null;
196-
for (Annotation annotation : paramAnnotations[paramIndex]) {
197-
if (annotation instanceof Param) {
198-
name = ((Param) annotation).value();
199-
break;
200-
}
188+
List<String> paramNames = new ArrayList<String>();
189+
List<String> actualParamNames = null;
190+
final Annotation[][] paramAnnotations = constructor.getParameterAnnotations();
191+
int paramCount = paramAnnotations.length;
192+
for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {
193+
String name = null;
194+
for (Annotation annotation : paramAnnotations[paramIndex]) {
195+
if (annotation instanceof Param) {
196+
name = ((Param) annotation).value();
197+
break;
198+
}
199+
}
200+
if (name == null && resultMap.configuration.isUseActualParamName() && Jdk.parameterExists) {
201+
if (actualParamNames == null) {
202+
actualParamNames = ParamNameUtil.getParamNames(constructor);
203+
}
204+
if (actualParamNames.size() > paramIndex) {
205+
name = actualParamNames.get(paramIndex);
201206
}
202-
paramNames.add(name != null ? name : "arg" + paramIndex);
203207
}
204-
return paramNames;
208+
paramNames.add(name != null ? name : "arg" + paramIndex);
205209
}
210+
return paramNames;
206211
}
207212
}
208213

src/test/java/org/apache/ibatis/submitted/named_constructor_args/User.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ public User(@Param("id") String id) {
2828
this.id = Integer.valueOf(id);
2929
}
3030

31-
public User(Integer userId, String name) {
31+
public User(Integer userId, @Param("name") String userName) {
3232
super();
3333
this.id = userId;
34-
this.name = name;
34+
this.name = userName;
3535
}
3636

3737
public User(@Param("id") int id, @Param("name") String name, @Param("team") String team) {

0 commit comments

Comments
 (0)