@@ -39,11 +39,11 @@ public class ProviderSqlSource implements SqlSource {
39
39
private final Class <?> providerType ;
40
40
private final LanguageDriver languageDriver ;
41
41
private final Method mapperMethod ;
42
- private Method providerMethod ;
43
- private String [] providerMethodArgumentNames ;
44
- private Class <?>[] providerMethodParameterTypes ;
45
- private ProviderContext providerContext ;
46
- private Integer providerContextIndex ;
42
+ private final Method providerMethod ;
43
+ private final String [] providerMethodArgumentNames ;
44
+ private final Class <?>[] providerMethodParameterTypes ;
45
+ private final ProviderContext providerContext ;
46
+ private final Integer providerContextIndex ;
47
47
48
48
/**
49
49
* @deprecated Since 3.5.3, Please use the {@link #ProviderSqlSource(Configuration, Annotation, Class, Method)} instead of this.
@@ -68,29 +68,30 @@ public ProviderSqlSource(Configuration configuration, Object provider, Class<?>
68
68
* @since 3.5.3
69
69
*/
70
70
public ProviderSqlSource (Configuration configuration , Annotation provider , Class <?> mapperType , Method mapperMethod ) {
71
- String providerMethodName ;
71
+ String candidateProviderMethodName ;
72
+ Method candidateProviderMethod = null ;
72
73
try {
73
74
this .configuration = configuration ;
74
75
this .mapperMethod = mapperMethod ;
75
76
Lang lang = mapperMethod == null ? null : mapperMethod .getAnnotation (Lang .class );
76
77
this .languageDriver = configuration .getLanguageDriver (lang == null ? null : lang .value ());
77
78
this .providerType = getProviderType (provider , mapperMethod );
78
- providerMethodName = (String ) provider .annotationType ().getMethod ("method" ).invoke (provider );
79
+ candidateProviderMethodName = (String ) provider .annotationType ().getMethod ("method" ).invoke (provider );
79
80
80
- if (providerMethodName .length () == 0 && ProviderMethodResolver .class .isAssignableFrom (this .providerType )) {
81
- this . providerMethod = ((ProviderMethodResolver ) this .providerType .getDeclaredConstructor ().newInstance ())
81
+ if (candidateProviderMethodName .length () == 0 && ProviderMethodResolver .class .isAssignableFrom (this .providerType )) {
82
+ candidateProviderMethod = ((ProviderMethodResolver ) this .providerType .getDeclaredConstructor ().newInstance ())
82
83
.resolveMethod (new ProviderContext (mapperType , mapperMethod , configuration .getDatabaseId ()));
83
84
}
84
- if (this . providerMethod == null ) {
85
- providerMethodName = providerMethodName .length () == 0 ? "provideSql" : providerMethodName ;
85
+ if (candidateProviderMethod == null ) {
86
+ candidateProviderMethodName = candidateProviderMethodName .length () == 0 ? "provideSql" : candidateProviderMethodName ;
86
87
for (Method m : this .providerType .getMethods ()) {
87
- if (providerMethodName .equals (m .getName ()) && CharSequence .class .isAssignableFrom (m .getReturnType ())) {
88
- if (this . providerMethod != null ) {
88
+ if (candidateProviderMethodName .equals (m .getName ()) && CharSequence .class .isAssignableFrom (m .getReturnType ())) {
89
+ if (candidateProviderMethod != null ) {
89
90
throw new BuilderException ("Error creating SqlSource for SqlProvider. Method '"
90
- + providerMethodName + "' is found multiple in SqlProvider '" + this .providerType .getName ()
91
+ + candidateProviderMethodName + "' is found multiple in SqlProvider '" + this .providerType .getName ()
91
92
+ "'. Sql provider method can not overload." );
92
93
}
93
- this . providerMethod = m ;
94
+ candidateProviderMethod = m ;
94
95
}
95
96
}
96
97
}
@@ -99,24 +100,30 @@ public ProviderSqlSource(Configuration configuration, Annotation provider, Class
99
100
} catch (Exception e ) {
100
101
throw new BuilderException ("Error creating SqlSource for SqlProvider. Cause: " + e , e );
101
102
}
102
- if (this . providerMethod == null ) {
103
+ if (candidateProviderMethod == null ) {
103
104
throw new BuilderException ("Error creating SqlSource for SqlProvider. Method '"
104
- + providerMethodName + "' not found in SqlProvider '" + this .providerType .getName () + "'." );
105
+ + candidateProviderMethodName + "' not found in SqlProvider '" + this .providerType .getName () + "'." );
105
106
}
107
+ this .providerMethod = candidateProviderMethod ;
106
108
this .providerMethodArgumentNames = new ParamNameResolver (configuration , this .providerMethod ).getNames ();
107
109
this .providerMethodParameterTypes = this .providerMethod .getParameterTypes ();
110
+
111
+ ProviderContext candidateProviderContext = null ;
112
+ Integer candidateProviderContextIndex = null ;
108
113
for (int i = 0 ; i < this .providerMethodParameterTypes .length ; i ++) {
109
114
Class <?> parameterType = this .providerMethodParameterTypes [i ];
110
115
if (parameterType == ProviderContext .class ) {
111
- if (this . providerContext != null ) {
116
+ if (candidateProviderContext != null ) {
112
117
throw new BuilderException ("Error creating SqlSource for SqlProvider. ProviderContext found multiple in SqlProvider method ("
113
118
+ this .providerType .getName () + "." + providerMethod .getName ()
114
119
+ "). ProviderContext can not define multiple in SqlProvider method argument." );
115
120
}
116
- this . providerContext = new ProviderContext (mapperType , mapperMethod , configuration .getDatabaseId ());
117
- this . providerContextIndex = i ;
121
+ candidateProviderContext = new ProviderContext (mapperType , mapperMethod , configuration .getDatabaseId ());
122
+ candidateProviderContextIndex = i ;
118
123
}
119
124
}
125
+ this .providerContext = candidateProviderContext ;
126
+ this .providerContextIndex = candidateProviderContextIndex ;
120
127
}
121
128
122
129
@ Override
0 commit comments