11/*
2- * Copyright 2002-2011 the original author or authors.
2+ * Copyright 2002-2012 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1717package org .springframework .core .convert .support ;
1818
1919import java .util .Arrays ;
20+ import java .util .Collections ;
2021import java .util .HashMap ;
2122import java .util .LinkedHashMap ;
2223import java .util .List ;
@@ -55,7 +56,7 @@ public void scalarMap() throws Exception {
5556 }
5657 conversionService .addConverterFactory (new StringToNumberConverterFactory ());
5758 assertTrue (conversionService .canConvert (sourceType , targetType ));
58- @ SuppressWarnings ("unchecked" )
59+ @ SuppressWarnings ("unchecked" )
5960 Map <Integer , Integer > result = (Map <Integer , Integer >) conversionService .convert (map , sourceType , targetType );
6061 assertFalse (map .equals (result ));
6162 assertEquals ((Integer ) 9 , result .get (1 ));
@@ -79,7 +80,7 @@ public void scalarMapNotGenericSourceField() throws Exception {
7980 map .put ("1" , "9" );
8081 map .put ("2" , "37" );
8182 TypeDescriptor sourceType = new TypeDescriptor (getClass ().getField ("notGenericMapSource" ));
82- TypeDescriptor targetType = new TypeDescriptor (getClass ().getField ("scalarMapTarget" ));
83+ TypeDescriptor targetType = new TypeDescriptor (getClass ().getField ("scalarMapTarget" ));
8384 assertTrue (conversionService .canConvert (sourceType , targetType ));
8485 try {
8586 conversionService .convert (map , sourceType , targetType );
@@ -88,15 +89,15 @@ public void scalarMapNotGenericSourceField() throws Exception {
8889 }
8990 conversionService .addConverterFactory (new StringToNumberConverterFactory ());
9091 assertTrue (conversionService .canConvert (sourceType , targetType ));
91- @ SuppressWarnings ("unchecked" )
92+ @ SuppressWarnings ("unchecked" )
9293 Map <Integer , Integer > result = (Map <Integer , Integer >) conversionService .convert (map , sourceType , targetType );
9394 assertFalse (map .equals (result ));
9495 assertEquals ((Integer ) 9 , result .get (1 ));
95- assertEquals ((Integer ) 37 , result .get (2 ));
96+ assertEquals ((Integer ) 37 , result .get (2 ));
9697 }
97-
98+
9899 public Map notGenericMapSource ;
99-
100+
100101 @ Test
101102 public void collectionMap () throws Exception {
102103 Map <String , List <String >> map = new HashMap <String , List <String >>();
@@ -109,11 +110,11 @@ public void collectionMap() throws Exception {
109110 conversionService .convert (map , sourceType , targetType );
110111 } catch (ConversionFailedException e ) {
111112 assertTrue (e .getCause () instanceof ConverterNotFoundException );
112- }
113+ }
113114 conversionService .addConverter (new CollectionToCollectionConverter (conversionService ));
114115 conversionService .addConverterFactory (new StringToNumberConverterFactory ());
115116 assertTrue (conversionService .canConvert (sourceType , targetType ));
116- @ SuppressWarnings ("unchecked" )
117+ @ SuppressWarnings ("unchecked" )
117118 Map <Integer , List <Integer >> result = (Map <Integer , List <Integer >>) conversionService .convert (map , sourceType , targetType );
118119 assertFalse (map .equals (result ));
119120 assertEquals (Arrays .asList (9 , 12 ), result .get (1 ));
@@ -134,12 +135,12 @@ public void collectionMapSourceTarget() throws Exception {
134135 conversionService .convert (map , sourceType , targetType );
135136 fail ("Should have failed" );
136137 } catch (ConverterNotFoundException e ) {
137-
138+
138139 }
139140 conversionService .addConverter (new CollectionToCollectionConverter (conversionService ));
140141 conversionService .addConverterFactory (new StringToNumberConverterFactory ());
141142 assertTrue (conversionService .canConvert (sourceType , targetType ));
142- @ SuppressWarnings ("unchecked" )
143+ @ SuppressWarnings ("unchecked" )
143144 Map <Integer , List <Integer >> result = (Map <Integer , List <Integer >>) conversionService .convert (map , sourceType , targetType );
144145 assertFalse (map .equals (result ));
145146 assertEquals (Arrays .asList (9 , 12 ), result .get (1 ));
@@ -167,7 +168,7 @@ public void collectionMapNotGenericTargetCollectionToObjectInteraction() throws
167168 assertTrue (conversionService .canConvert (Map .class , Map .class ));
168169 assertSame (map , conversionService .convert (map , Map .class ));
169170 }
170-
171+
171172 @ Test
172173 public void emptyMap () throws Exception {
173174 Map <String , String > map = new HashMap <String , String >();
@@ -200,4 +201,26 @@ public void emptyMapDifferentTargetImplType() throws Exception {
200201
201202 public LinkedHashMap <String , String > emptyMapDifferentTarget ;
202203
204+ @ Test
205+ public void noDefaultConstructorCopyNotRequired () throws Exception {
206+ // SPR-9284
207+ NoDefaultConstructorMap <String , Integer > map = new NoDefaultConstructorMap <String ,Integer >(
208+ Collections .<String , Integer > singletonMap ("1" , 1 ));
209+ TypeDescriptor sourceType = TypeDescriptor .map (NoDefaultConstructorMap .class ,
210+ TypeDescriptor .valueOf (String .class ), TypeDescriptor .valueOf (Integer .class ));
211+ TypeDescriptor targetType = TypeDescriptor .map (NoDefaultConstructorMap .class ,
212+ TypeDescriptor .valueOf (String .class ), TypeDescriptor .valueOf (Integer .class ));
213+ assertTrue (conversionService .canConvert (sourceType , targetType ));
214+ @ SuppressWarnings ("unchecked" )
215+ Map <String , Integer > result = (Map <String , Integer >) conversionService .convert (map , sourceType , targetType );
216+ assertEquals (map , result );
217+ assertEquals (NoDefaultConstructorMap .class , result .getClass ());
218+ }
219+
220+ public static class NoDefaultConstructorMap <K , V > extends HashMap <K , V > {
221+ public NoDefaultConstructorMap (Map <? extends K , ? extends V > m ) {
222+ super (m );
223+ }
224+ }
225+
203226}
0 commit comments