Skip to content

Commit 912dce9

Browse files
committed
#1694 - Avoid serializing empty beans in EntityModel.
The unwrapping nature of EntityModel.getContent() does not work well with value that would result in an empty object being rendered. We now skip the rendering if failing for empty beans is disabled.
1 parent 4642aea commit 912dce9

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/main/java/org/springframework/hateoas/EntityModel.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@
3333
import com.fasterxml.jackson.databind.BeanProperty;
3434
import com.fasterxml.jackson.databind.JsonMappingException;
3535
import com.fasterxml.jackson.databind.JsonSerializer;
36+
import com.fasterxml.jackson.databind.SerializationFeature;
3637
import com.fasterxml.jackson.databind.SerializerProvider;
3738
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
3839
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
40+
import com.fasterxml.jackson.databind.ser.impl.UnknownSerializer;
3941
import com.fasterxml.jackson.databind.ser.std.JsonValueSerializer;
4042
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
4143
import com.fasterxml.jackson.databind.util.NameTransformer;
@@ -235,6 +237,11 @@ public void serialize(@Nullable Object value, @Nullable JsonGenerator gen, @NonN
235237

236238
JsonSerializer<Object> serializer = provider.findValueSerializer(value.getClass());
237239

240+
if (UnknownSerializer.class.isInstance(serializer)
241+
&& !provider.isEnabled(SerializationFeature.FAIL_ON_EMPTY_BEANS)) {
242+
return;
243+
}
244+
238245
if (JsonValueSerializer.class.isInstance(serializer)) {
239246
throw new IllegalStateException(
240247
"@JsonValue rendered classes can not be directly nested in EntityModel as they do not produce a document key!");

src/test/java/org/springframework/hateoas/EntityModelIntegrationTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121

2222
import com.fasterxml.jackson.annotation.JsonAutoDetect;
2323
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
24+
import com.fasterxml.jackson.databind.JsonMappingException;
25+
import com.fasterxml.jackson.databind.ObjectMapper;
26+
import com.fasterxml.jackson.databind.SerializationFeature;
2427

2528
/**
2629
* Integration tests for {@link EntityModel}.
@@ -59,6 +62,22 @@ void readsResourceSupportCorrectly() throws Exception {
5962
assertThat(result.getContent().lastname).isEqualTo("Matthews");
6063
}
6164

65+
@Test // #1686
66+
void doesNotFailOnSerializingEmptyBean() {
67+
68+
ObjectMapper mapper = MappingTestUtils.defaultObjectMapper();
69+
70+
// Fail if we're supposed to
71+
assertThatExceptionOfType(JsonMappingException.class) //
72+
.isThrownBy(() -> mapper.enable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
73+
.writeValueAsString(EntityModel.of(new Empty())));
74+
75+
// Ignore empty bean if we're supposed to
76+
assertThatNoException() //
77+
.isThrownBy(() -> mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
78+
.writeValueAsString(EntityModel.of(new Empty())));
79+
}
80+
6281
static class PersonModel extends EntityModel<Person> {
6382

6483
public PersonModel(Person person) {
@@ -74,4 +93,6 @@ static class Person {
7493
String firstname;
7594
String lastname;
7695
}
96+
97+
static class Empty {}
7798
}

0 commit comments

Comments
 (0)