У меня есть поле в каждом моем объекте, которое должно содержать строковое представление 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;
}