|
19 | 19 | import java.lang.reflect.Constructor;
|
20 | 20 | import java.util.Collection;
|
21 | 21 | import java.util.Collections;
|
22 |
| -import java.util.HashMap; |
23 | 22 | import java.util.List;
|
24 | 23 | import java.util.Map;
|
25 | 24 | import java.util.Optional;
|
@@ -222,14 +221,11 @@ private Object createValue(
|
222 | 221 | // Default constructor with data binding
|
223 | 222 |
|
224 | 223 | if (ctor.getParameterCount() == 0) {
|
225 |
| - MutablePropertyValues mpvs = new MutablePropertyValues(); |
226 |
| - visitArgumentMap(rawMap, mpvs, new Stack<>()); |
227 |
| - |
228 | 224 | target = BeanUtils.instantiateClass(ctor);
|
229 | 225 | DataBinder dataBinder = new DataBinder(target);
|
230 | 226 | dataBinder.getBindingResult().setNestedPath(toArgumentPath(segments));
|
231 | 227 | dataBinder.setConversionService(getConversionService());
|
232 |
| - dataBinder.bind(mpvs); |
| 228 | + dataBinder.bind(initBindValues(rawMap)); |
233 | 229 |
|
234 | 230 | if (dataBinder.getBindingResult().hasErrors()) {
|
235 | 231 | addErrors(dataBinder, bindingResult, segments);
|
@@ -284,35 +280,42 @@ else if (rawValue instanceof Map) {
|
284 | 280 | }
|
285 | 281 | }
|
286 | 282 |
|
287 |
| - @SuppressWarnings("unchecked") |
288 |
| - private void visitArgumentMap(Map<String, Object> rawMap, MutablePropertyValues mpvs, Stack<String> segments) { |
| 283 | + private MutablePropertyValues initBindValues(Map<String, Object> rawMap) { |
| 284 | + MutablePropertyValues mpvs = new MutablePropertyValues(); |
| 285 | + Stack<String> segments = new Stack<>(); |
289 | 286 | for (String key : rawMap.keySet()) {
|
290 |
| - Object rawValue = rawMap.get(key); |
291 |
| - if (rawValue instanceof List) { |
292 |
| - List<Object> items = (List<Object>) rawValue; |
293 |
| - if (items.isEmpty()) { |
294 |
| - segments.push(key); |
295 |
| - mpvs.add(toArgumentPath(segments), rawValue); |
296 |
| - segments.pop(); |
297 |
| - } |
298 |
| - else { |
299 |
| - Map<String, Object> subValues = new HashMap<>(items.size()); |
300 |
| - for (int i = 0; i < items.size(); i++) { |
301 |
| - subValues.put(key + "[" + i + "]", items.get(i)); |
302 |
| - } |
303 |
| - visitArgumentMap(subValues, mpvs, segments); |
304 |
| - } |
305 |
| - } |
306 |
| - else if (rawValue instanceof Map) { |
307 |
| - segments.push(key + "."); |
308 |
| - visitArgumentMap((Map<String, Object>) rawValue, mpvs, segments); |
| 287 | + addBindValues(mpvs, key, rawMap.get(key), segments); |
| 288 | + } |
| 289 | + return mpvs; |
| 290 | + } |
| 291 | + |
| 292 | + @SuppressWarnings("unchecked") |
| 293 | + private void addBindValues(MutablePropertyValues mpvs, String name, Object value, Stack<String> segments) { |
| 294 | + if (value instanceof List) { |
| 295 | + List<Object> items = (List<Object>) value; |
| 296 | + if (items.isEmpty()) { |
| 297 | + segments.push(name); |
| 298 | + mpvs.add(toArgumentPath(segments), value); |
309 | 299 | segments.pop();
|
310 | 300 | }
|
311 | 301 | else {
|
312 |
| - segments.push(key); |
313 |
| - mpvs.add(toArgumentPath(segments), rawValue); |
314 |
| - segments.pop(); |
| 302 | + for (int i = 0; i < items.size(); i++) { |
| 303 | + addBindValues(mpvs, name + "[" + i + "]", items.get(i), segments); |
| 304 | + } |
| 305 | + } |
| 306 | + } |
| 307 | + else if (value instanceof Map) { |
| 308 | + segments.push(name + "."); |
| 309 | + Map<String, Object> map = (Map<String, Object>) value; |
| 310 | + for (String key : map.keySet()) { |
| 311 | + addBindValues(mpvs, key, map.get(key), segments); |
315 | 312 | }
|
| 313 | + segments.pop(); |
| 314 | + } |
| 315 | + else { |
| 316 | + segments.push(name); |
| 317 | + mpvs.add(toArgumentPath(segments), value); |
| 318 | + segments.pop(); |
316 | 319 | }
|
317 | 320 | }
|
318 | 321 |
|
|
0 commit comments