20
20
import java .util .Arrays ;
21
21
import java .util .List ;
22
22
import java .util .Map ;
23
+ import java .util .Map .Entry ;
23
24
24
25
import org .springframework .core .MethodParameter ;
25
26
import org .springframework .core .convert .ConversionService ;
30
31
import org .springframework .data .repository .core .RepositoryMetadata ;
31
32
import org .springframework .data .repository .query .Param ;
32
33
import org .springframework .util .Assert ;
34
+ import org .springframework .util .LinkedMultiValueMap ;
35
+ import org .springframework .util .MultiValueMap ;
33
36
import org .springframework .util .ReflectionUtils ;
34
37
import org .springframework .util .StringUtils ;
35
38
@@ -164,12 +167,32 @@ public void invokeDelete(Serializable id) {
164
167
}
165
168
}
166
169
170
+ /*
171
+ * (non-Javadoc)
172
+ * @see org.springframework.data.repository.support.RepositoryInvoker#invokeQueryMethod(java.lang.reflect.Method, java.util.Map, org.springframework.data.domain.Pageable, org.springframework.data.domain.Sort)
173
+ */
174
+ @ Override
175
+ public Object invokeQueryMethod (Method method , Map <String , String []> parameters , Pageable pageable , Sort sort ) {
176
+
177
+ Assert .notNull (method , "Method must not be null!" );
178
+ Assert .notNull (parameters , "Parameters must not be null!" );
179
+
180
+ MultiValueMap <String , String > forward = new LinkedMultiValueMap <String , String >(parameters .size ());
181
+
182
+ for (Entry <String , String []> entry : parameters .entrySet ()) {
183
+ forward .put (entry .getKey (), Arrays .asList (entry .getValue ()));
184
+ }
185
+
186
+ return invokeQueryMethod (method , forward , pageable , sort );
187
+ }
188
+
167
189
/*
168
190
* (non-Javadoc)
169
191
* @see org.springframework.data.rest.core.invoke.RepositoryInvoker#invokeQueryMethod(java.lang.reflect.Method, java.util.Map, org.springframework.data.domain.Pageable, org.springframework.data.domain.Sort)
170
192
*/
171
193
@ Override
172
- public Object invokeQueryMethod (Method method , Map <String , String []> parameters , Pageable pageable , Sort sort ) {
194
+ public Object invokeQueryMethod (Method method , MultiValueMap <String , ? extends Object > parameters , Pageable pageable ,
195
+ Sort sort ) {
173
196
174
197
Assert .notNull (method , "Method must not be null!" );
175
198
Assert .notNull (parameters , "Parameters must not be null!" );
@@ -179,7 +202,8 @@ public Object invokeQueryMethod(Method method, Map<String, String[]> parameters,
179
202
return invoke (method , prepareParameters (method , parameters , pageable , sort ));
180
203
}
181
204
182
- private Object [] prepareParameters (Method method , Map <String , String []> rawParameters , Pageable pageable , Sort sort ) {
205
+ private Object [] prepareParameters (Method method , MultiValueMap <String , ? extends Object > rawParameters ,
206
+ Pageable pageable , Sort sort ) {
183
207
184
208
List <MethodParameter > parameters = new MethodParameters (method , PARAM_ANNOTATION ).getParameters ();
185
209
@@ -208,10 +232,10 @@ private Object[] prepareParameters(Method method, Map<String, String[]> rawParam
208
232
+ " for parameter " + parameterName );
209
233
}
210
234
211
- String [] parameterValue = rawParameters .get (parameterName );
212
- Object value = parameterValue == null ? null : parameterValue .length == 1 ? parameterValue [0 ] : parameterValue ;
235
+ Object value = unwrapSingleElement (rawParameters .get (parameterName ));
213
236
214
- result [i ] = conversionService .convert (value , TypeDescriptor .forObject (value ), new TypeDescriptor (param ));
237
+ result [i ] = targetType .isInstance (value ) ? value : conversionService .convert (value ,
238
+ TypeDescriptor .forObject (value ), new TypeDescriptor (param ));
215
239
}
216
240
}
217
241
@@ -275,4 +299,14 @@ protected Iterable<Object> invokeFindAllReflectively(Sort sort) {
275
299
276
300
return invoke (method , sort );
277
301
}
302
+
303
+ /**
304
+ * Unwraps the first item if the given source has exactly one element.
305
+ *
306
+ * @param source can be {@literal null}.
307
+ * @return
308
+ */
309
+ private static Object unwrapSingleElement (List <? extends Object > source ) {
310
+ return source == null ? null : source .size () == 1 ? source .get (0 ) : source ;
311
+ }
278
312
}
0 commit comments