@@ -115,6 +115,7 @@ void setUp() {
115115 mappingContext .getPersistentEntity (Pear .class );
116116 mappingContext .getPersistentEntity (WithCustomMappedPrimitiveCollection .class );
117117 mappingContext .getPersistentEntity (BugModel .class );
118+ mappingContext .getPersistentEntity (ArrayListHolder .class );
118119 mappingContext .afterPropertiesSet ();
119120
120121 this .entities = new PersistentEntities (Collections .singleton (mappingContext ));
@@ -704,6 +705,42 @@ void deserializesNewNestedEntitiesCorrectly() throws Exception {
704705 .containsExactly ("Foo" , "Bar" );
705706 }
706707
708+ @ Test // #2325
709+ void arraysCanMutateAndAppendDuringMerge () throws Exception {
710+
711+ ObjectMapper mapper = new ObjectMapper ();
712+ ArrayHolder target = new ArrayHolder (new String [] { "ancient" , "old" , "older" });
713+ JsonNode node = mapper .readTree ("{ \" array\" : [ \" new\" , \" old\" , \" newer\" , \" bleeding edge\" ] }" );
714+
715+ ArrayHolder updated = reader .doMerge ((ObjectNode ) node , target , mapper );
716+
717+ assertThat (updated .array ).containsExactly ("new" , "old" , "newer" , "bleeding edge" );
718+ }
719+
720+ @ Test // #2325
721+ void arraysCanAppendMoreThanOneElementDuringMerge () throws Exception {
722+
723+ ObjectMapper mapper = new ObjectMapper ();
724+ ArrayListHolder target = new ArrayListHolder ("ancient" , "old" , "older" );
725+ JsonNode node = mapper .readTree ("{ \" values\" : [ \" ancient\" , \" old\" , \" older\" , \" new\" , \" newer\" ] }" );
726+
727+ ArrayListHolder updated = reader .doMerge ((ObjectNode ) node , target , mapper );
728+
729+ assertThat (updated .values ).containsExactly ("ancient" , "old" , "older" , "new" , "newer" );
730+ }
731+
732+ @ Test // #2325
733+ void arraysCanRemoveElementsDuringMerge () throws Exception {
734+
735+ ObjectMapper mapper = new ObjectMapper ();
736+ ArrayHolder target = new ArrayHolder (new String [] { "ancient" , "old" , "older" });
737+ JsonNode node = mapper .readTree ("{ \" array\" : [ \" ancient\" ] }" );
738+
739+ ArrayHolder updated = reader .doMerge ((ObjectNode ) node , target , mapper );
740+
741+ assertThat (updated .array ).containsExactly ("ancient" );
742+ }
743+
707744 @ SuppressWarnings ("unchecked" )
708745 private static <T > T as (Object source , Class <T > type ) {
709746
@@ -1000,4 +1037,16 @@ static class NestedModel {
10001037 public String value ;
10011038 }
10021039 }
1040+
1041+ static class ArrayListHolder {
1042+ Collection <String > values ;
1043+
1044+ ArrayListHolder (String ... values ) {
1045+ this .values = new ArrayList <>(Arrays .asList (values ));
1046+ }
1047+
1048+ public void setValues (Collection <String > values ) {
1049+ this .values = values ;
1050+ }
1051+ }
10031052}
0 commit comments