32
32
import org .springframework .hateoas .Link ;
33
33
import org .springframework .hateoas .Links ;
34
34
import org .springframework .hateoas .RelProvider ;
35
+ import org .springframework .hateoas .RenderSingleLinks ;
35
36
import org .springframework .hateoas .Resource ;
36
37
import org .springframework .hateoas .ResourceSupport ;
37
38
import org .springframework .hateoas .Resources ;
@@ -123,20 +124,22 @@ public static class HalLinkListSerializer extends ContainerSerializer<List<Link>
123
124
private final CurieProvider curieProvider ;
124
125
private final EmbeddedMapper mapper ;
125
126
private final MessageSourceAccessor accessor ;
127
+ private final RenderSingleLinks renderSingleLinks ;
126
128
127
- public HalLinkListSerializer (CurieProvider curieProvider , EmbeddedMapper mapper , MessageSourceAccessor accessor ) {
128
- this (null , curieProvider , mapper , accessor );
129
+ public HalLinkListSerializer (CurieProvider curieProvider , EmbeddedMapper mapper , MessageSourceAccessor accessor , RenderSingleLinks renderSingleLinks ) {
130
+ this (null , curieProvider , mapper , accessor , renderSingleLinks );
129
131
}
130
132
131
133
public HalLinkListSerializer (BeanProperty property , CurieProvider curieProvider , EmbeddedMapper mapper ,
132
- MessageSourceAccessor accessor ) {
134
+ MessageSourceAccessor accessor , RenderSingleLinks renderSingleLinks ) {
133
135
134
136
super (TypeFactory .defaultInstance ().constructType (List .class ));
135
137
136
138
this .property = property ;
137
139
this .curieProvider = curieProvider ;
138
140
this .mapper = mapper ;
139
141
this .accessor = accessor ;
142
+ this .renderSingleLinks = renderSingleLinks ;
140
143
}
141
144
142
145
/*
@@ -198,7 +201,7 @@ public void serialize(List<Link> value, JsonGenerator jgen, SerializerProvider p
198
201
JavaType mapType = typeFactory .constructMapType (HashMap .class , keyType , valueType );
199
202
200
203
MapSerializer serializer = MapSerializer .construct (new String [] {}, mapType , true , null ,
201
- provider .findKeySerializer (keyType , null ), new OptionalListJackson2Serializer (property ), null );
204
+ provider .findKeySerializer (keyType , null ), new OptionalListJackson2Serializer (property , renderSingleLinks ), null );
202
205
203
206
serializer .serialize (sortedLinks , jgen , provider );
204
207
}
@@ -246,7 +249,7 @@ private String getTitle(String localRel) {
246
249
@ Override
247
250
public JsonSerializer <?> createContextual (SerializerProvider provider , BeanProperty property )
248
251
throws JsonMappingException {
249
- return new HalLinkListSerializer (property , curieProvider , mapper , accessor );
252
+ return new HalLinkListSerializer (property , curieProvider , mapper , accessor , renderSingleLinks );
250
253
}
251
254
252
255
/*
@@ -267,15 +270,7 @@ public JsonSerializer<?> getContentSerializer() {
267
270
return null ;
268
271
}
269
272
270
- /*
271
- * (non-Javadoc)
272
- * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#isEmpty(java.lang.Object)
273
- */
274
- public boolean isEmpty (List <Link > value ) {
275
- return isEmpty (null , value );
276
- }
277
-
278
- /*
273
+ /*
279
274
* (non-Javadoc)
280
275
* @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(com.fasterxml.jackson.databind.SerializerProvider, java.lang.Object)
281
276
*/
@@ -368,10 +363,6 @@ public JsonSerializer<?> getContentSerializer() {
368
363
return null ;
369
364
}
370
365
371
- public boolean isEmpty (Collection <?> value ) {
372
- return isEmpty (null , value );
373
- }
374
-
375
366
public boolean isEmpty (SerializerProvider provider , Collection <?> value ) {
376
367
return value .isEmpty ();
377
368
}
@@ -401,22 +392,28 @@ public static class OptionalListJackson2Serializer extends ContainerSerializer<O
401
392
402
393
private final BeanProperty property ;
403
394
private final Map <Class <?>, JsonSerializer <Object >> serializers ;
395
+ private final RenderSingleLinks renderSingleLinks ;
404
396
405
397
public OptionalListJackson2Serializer () {
406
- this (null );
398
+ this (null , RenderSingleLinks .AS_SINGLE );
399
+ }
400
+
401
+ public OptionalListJackson2Serializer (BeanProperty property ) {
402
+ this (property , RenderSingleLinks .AS_SINGLE );
407
403
}
408
404
409
405
/**
410
406
* Creates a new {@link OptionalListJackson2Serializer} using the given {@link BeanProperty}.
411
407
*
412
408
* @param property
413
409
*/
414
- public OptionalListJackson2Serializer (BeanProperty property ) {
410
+ public OptionalListJackson2Serializer (BeanProperty property , RenderSingleLinks renderSingleLinks ) {
415
411
416
412
super (TypeFactory .defaultInstance ().constructType (List .class ));
417
413
418
414
this .property = property ;
419
415
this .serializers = new HashMap <Class <?>, JsonSerializer <Object >>();
416
+ this .renderSingleLinks = renderSingleLinks ;
420
417
}
421
418
422
419
/*
@@ -434,15 +431,15 @@ public ContainerSerializer<?> _withValueTypeSerializer(TypeSerializer vts) {
434
431
*/
435
432
@ Override
436
433
public void serialize (Object value , JsonGenerator jgen , SerializerProvider provider )
437
- throws IOException , JsonGenerationException {
434
+ throws IOException {
438
435
439
436
List <?> list = (List <?>) value ;
440
437
441
438
if (list .isEmpty ()) {
442
439
return ;
443
440
}
444
441
445
- if (list .size () == 1 ) {
442
+ if (list .size () == 1 && this . renderSingleLinks == RenderSingleLinks . AS_SINGLE ) {
446
443
serializeContents (list .iterator (), jgen , provider );
447
444
return ;
448
445
}
@@ -506,15 +503,7 @@ public boolean hasSingleElement(Object arg0) {
506
503
return false ;
507
504
}
508
505
509
- /*
510
- * (non-Javadoc)
511
- * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#isEmpty(java.lang.Object)
512
- */
513
- public boolean isEmpty (Object value ) {
514
- return isEmpty (null , value );
515
- }
516
-
517
- /*
506
+ /*
518
507
* (non-Javadoc)
519
508
* @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(com.fasterxml.jackson.databind.SerializerProvider, java.lang.Object)
520
509
*/
@@ -577,7 +566,7 @@ public List<Link> deserialize(JsonParser jp, DeserializationContext ctxt)
577
566
while (!JsonToken .END_OBJECT .equals (jp .nextToken ())) {
578
567
579
568
if (!JsonToken .FIELD_NAME .equals (jp .getCurrentToken ())) {
580
- throw new JsonParseException ("Expected relation name" , jp .getCurrentLocation ());
569
+ throw new JsonParseException (jp , "Expected relation name" , jp .getCurrentLocation ());
581
570
}
582
571
583
572
// save the relation in case the link does not contain it
@@ -653,7 +642,7 @@ public List<Object> deserialize(JsonParser jp, DeserializationContext ctxt)
653
642
while (!JsonToken .END_OBJECT .equals (jp .nextToken ())) {
654
643
655
644
if (!JsonToken .FIELD_NAME .equals (jp .getCurrentToken ())) {
656
- throw new JsonParseException ("Expected relation name" , jp .getCurrentLocation ());
645
+ throw new JsonParseException (jp , "Expected relation name" , jp .getCurrentLocation ());
657
646
}
658
647
659
648
if (JsonToken .START_ARRAY .equals (jp .nextToken ())) {
@@ -702,8 +691,16 @@ public static class HalHandlerInstantiator extends HandlerInstantiator {
702
691
* @param beanFactory can be {@literal null}
703
692
*/
704
693
public HalHandlerInstantiator (RelProvider provider , CurieProvider curieProvider , MessageSourceAccessor accessor ,
705
- AutowireCapableBeanFactory beanFactory ) {
706
- this (provider , curieProvider , accessor , true , beanFactory );
694
+ AutowireCapableBeanFactory beanFactory , RenderSingleLinks renderSingleLinks ) {
695
+ this (provider , curieProvider , accessor , true , beanFactory , renderSingleLinks );
696
+ }
697
+
698
+ public HalHandlerInstantiator (RelProvider provider , CurieProvider curieProvider , MessageSourceAccessor messageSourceAccessor , AutowireCapableBeanFactory beanFactory ) {
699
+ this (provider , curieProvider , messageSourceAccessor , beanFactory , RenderSingleLinks .AS_SINGLE );
700
+ }
701
+
702
+ public HalHandlerInstantiator (RelProvider provider , CurieProvider curieProvider , MessageSourceAccessor messageSourceAccessor ) {
703
+ this (provider , curieProvider , messageSourceAccessor , RenderSingleLinks .AS_SINGLE );
707
704
}
708
705
709
706
/**
@@ -716,8 +713,8 @@ public HalHandlerInstantiator(RelProvider provider, CurieProvider curieProvider,
716
713
* @param messageSourceAccessor can be {@literal null}.
717
714
*/
718
715
public HalHandlerInstantiator (RelProvider provider , CurieProvider curieProvider ,
719
- MessageSourceAccessor messageSourceAccessor ) {
720
- this (provider , curieProvider , messageSourceAccessor , true );
716
+ MessageSourceAccessor messageSourceAccessor , RenderSingleLinks renderSingleLinks ) {
717
+ this (provider , curieProvider , messageSourceAccessor , true , renderSingleLinks );
721
718
}
722
719
723
720
/**
@@ -732,12 +729,12 @@ public HalHandlerInstantiator(RelProvider provider, CurieProvider curieProvider,
732
729
* @param enforceEmbeddedCollections
733
730
*/
734
731
public HalHandlerInstantiator (RelProvider provider , CurieProvider curieProvider , MessageSourceAccessor accessor ,
735
- boolean enforceEmbeddedCollections ) {
736
- this (provider , curieProvider , accessor , enforceEmbeddedCollections , null );
732
+ boolean enforceEmbeddedCollections , RenderSingleLinks renderSingleLinks ) {
733
+ this (provider , curieProvider , accessor , enforceEmbeddedCollections , null , renderSingleLinks );
737
734
}
738
735
739
736
private HalHandlerInstantiator (RelProvider provider , CurieProvider curieProvider , MessageSourceAccessor accessor ,
740
- boolean enforceEmbeddedCollections , AutowireCapableBeanFactory delegate ) {
737
+ boolean enforceEmbeddedCollections , AutowireCapableBeanFactory delegate , RenderSingleLinks renderSingleLinks ) {
741
738
742
739
Assert .notNull (provider , "RelProvider must not be null!" );
743
740
@@ -746,7 +743,7 @@ private HalHandlerInstantiator(RelProvider provider, CurieProvider curieProvider
746
743
this .delegate = delegate ;
747
744
748
745
this .serializers .put (HalResourcesSerializer .class , new HalResourcesSerializer (mapper ));
749
- this .serializers .put (HalLinkListSerializer .class , new HalLinkListSerializer (curieProvider , mapper , accessor ));
746
+ this .serializers .put (HalLinkListSerializer .class , new HalLinkListSerializer (curieProvider , mapper , accessor , renderSingleLinks ));
750
747
}
751
748
752
749
/*
@@ -820,14 +817,6 @@ public TrueOnlyBooleanSerializer() {
820
817
}
821
818
822
819
/*
823
- * (non-Javadoc)
824
- * @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(java.lang.Object)
825
- */
826
- public boolean isEmpty (Boolean value ) {
827
- return isEmpty (null , value );
828
- }
829
-
830
- /*
831
820
* (non-Javadoc)
832
821
* @see com.fasterxml.jackson.databind.JsonSerializer#isEmpty(com.fasterxml.jackson.databind.SerializerProvider, java.lang.Object)
833
822
*/
0 commit comments