1

I have field in each of my object which should hold String representation of JSON for that object. I marked field with @JsonRawValue annotation. Now I want this field to have String representation of JSON for that object. So I have written custom deserializer and configure it as given by Roy Truelove's great answer. While debugging I found deserializer has been configured for field having annotation @JsonRawValue. But it never get called during deserialization because this field is not present in JSON response. Can please some tell me is there any way to get it called even if field is not present in JSON message to set its value.

public class TestObject{

@JsonProperty("employees")
private List<Employee> employees;


@JsonRawValue
private String getEmployeeResults;

My Deserializer

public class KeepAsJsonDeserialzier extends JsonDeserializer<String> {

@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

    TreeNode tree = jp.getCodec().readTree(jp);
    return tree.toString();
}

}

My module

public class BeanDeserializerModifierImpl extends BeanDeserializerModifier {

@Override
public BeanDeserializerBuilder updateBuilder(DeserializationConfig config,
        BeanDescription beanDesc, BeanDeserializerBuilder builder) {
    Iterator<SettableBeanProperty> it = builder.getProperties();
    while (it.hasNext()) {
        SettableBeanProperty p = it.next();
        if (p.getAnnotation(JsonRawValue.class) != null) {
            builder.addOrReplaceProperty(p.withValueDeserializer(new KeepAsJsonDeserialzier()),
                    true);
        }
    }
    return builder;
}

}

public class ModuleImpl extends Module {

@Override
public void setupModule(SetupContext context) {
    context.addBeanDeserializerModifier(new BeanDeserializerModifierImpl());
}

@Override
public String getModuleName() {
    return "JsonRawValueModule";
}

@Override
public Version version() {
    // TODO Auto-generated method stub
    return Version.unknownVersion();
}

}

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setRequestFactory(bufferingClientHttpRequestFactory());
    java.util.List<HttpMessageConverter<?>> messageConverters = restTemplate
            .getMessageConverters();
    for (HttpMessageConverter<?> messageConverter : messageConverters) {
        if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
            MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter;
            ObjectMapper objectMapper = new ObjectMapper().registerModule(moduleImpl);

            m.setObjectMapper(objectMapper);

        }
    }
    return restTemplate;
}
anand kadu
  • 68
  • 4

0 Answers0