Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public JsonDeserializer<?> findDeserializer(Annotated a) {
}

String empty = StoredAsJson.NULL.equals(storedAsJson.empty()) ? "null" : storedAsJson.empty();
return new StoredAsJsonDeserializer(a.getRawType(), a.getType(), empty, objectMapper);
return new StoredAsJsonDeserializer(a.getRawType(), a.getType(), empty, objectMapper, storedAsJson.binary());
}

if (rosettaDeserialize != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ public class StoredAsJsonDeserializer<T> extends StdScalarDeserializer<T> {
private final String defaultValue;
private final ObjectMapper objectMapper;

public StoredAsJsonDeserializer(Class<T> vc, Type type, String defaultValue, ObjectMapper objectMapper) {
private final boolean storedAsBinary;

public StoredAsJsonDeserializer(Class<T> vc, Type type, String defaultValue, ObjectMapper objectMapper, boolean storedAsBinary) {
super(vc);
this.type = type;
this.defaultValue = defaultValue;
this.objectMapper = objectMapper;
this.storedAsBinary = storedAsBinary;
}

@Override
Expand All @@ -33,17 +36,25 @@ public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOExcept
ObjectMapper mapper = (ObjectMapper) jp.getCodec();

if (jp.getCurrentToken() == JsonToken.VALUE_STRING) {
return deserialize(mapper, jp.getText(), javaType);
if (storedAsBinary) {
return deserializeAsBinary(jp, javaType, mapper);
} else {
return deserialize(mapper, jp.getText(), javaType);
}
} else if (jp.getCurrentToken() == JsonToken.VALUE_EMBEDDED_OBJECT) {
String json = new String(jp.getBinaryValue(Base64Variants.getDefaultVariant()), StandardCharsets.UTF_8);
return deserialize(mapper, json, javaType);
} else if(jp.getCurrentToken() == JsonToken.START_OBJECT || jp.getCurrentToken() == JsonToken.START_ARRAY) {
return deserializeAsBinary(jp, javaType, mapper);
} else if (jp.getCurrentToken() == JsonToken.START_OBJECT || jp.getCurrentToken() == JsonToken.START_ARRAY) {
return mapper.readValue(jp, javaType);
} else {
throw ctxt.mappingException("Expected JSON String");
}
}

private T deserializeAsBinary(JsonParser jp, JavaType javaType, ObjectMapper mapper) throws IOException {
String json = new String(jp.getBinaryValue(Base64Variants.getDefaultVariant()), StandardCharsets.UTF_8);
return deserialize(mapper, json, javaType);
}

@Override
public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException {
// we're delegating to the our parent object mapper, so the TypeDeserializer doesn't matter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import static org.assertj.core.api.Assertions.assertThat;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

import com.fasterxml.jackson.core.JsonProcessingException;
Expand Down Expand Up @@ -373,10 +373,14 @@ public void testBinaryFieldNullDeserialization() throws JsonProcessingException
}

@Test
public void testBinaryFieldWithDefaultSerialization() {
public void testBinaryFieldWithDefaultSerialization() throws IOException {
bean.setBinaryFieldWithDefault(inner);

assertThat(Rosetta.getMapper().valueToTree(bean).get("binaryFieldWithDefault")).isEqualTo(expectedBinary);

String json = Rosetta.getMapper().writeValueAsString(bean);
StoredAsJsonBean deserBean = Rosetta.getMapper().readValue(json, StoredAsJsonBean.class);
assertThat(deserBean.getBinaryFieldWithDefault().getStringProperty()).isEqualTo("value");
}

@Test
Expand Down Expand Up @@ -581,7 +585,6 @@ public void itHandlesAnnotatedGenericSetterDeserialization() throws JsonProcessi
}

@Test
@Ignore
public void testNestedStoredAsJsonBeans() throws JsonProcessingException {
InnerBean innerBean = new InnerBean();
innerBean.setStringProperty("value");
Expand All @@ -593,7 +596,9 @@ public void testNestedStoredAsJsonBeans() throws JsonProcessingException {
top.setAnnotatedField(storedAsJsonBean);

JsonNode node = Rosetta.getMapper().valueToTree(top);
assertThat(Rosetta.getMapper().treeToValue(node, NestedStoredAsJsonBean.class)).isEqualTo(top);
NestedStoredAsJsonBean deserializedNested = Rosetta.getMapper().treeToValue(node, NestedStoredAsJsonBean.class);

assertThat(deserializedNested.getAnnotatedField().getAnnotatedField().getStringProperty()).isEqualTo("value");
}

@Test
Expand Down