Как вызвать собственный десериализатор для поля, которого нет в Json - PullRequest
0 голосов
/ 08 мая 2020

У меня есть поле в каждом моем объекте, которое должно содержать строковое представление JSON для этого объекта. Я отметил поле аннотацией @JsonRawValue. Теперь я хочу, чтобы это поле имело строковое представление JSON для этого объекта. Итак, я написал собственный десериализатор и настроил его, как указано в отличном ответе Роя Трулава . Во время отладки я обнаружил, что десериализатор настроен для поля с аннотацией @JsonRawValue. Но он никогда не вызывается во время десериализации, потому что это поле отсутствует в ответе JSON. Пожалуйста, скажите мне, есть ли способ вызвать его, даже если поле отсутствует в сообщении JSON, чтобы установить его значение.

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();
}

}

Мой модуль

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...