Я хочу настроить процесс десериализации JsonNullable<Boolean>. Итак, я нашел класс JsonNullableDeserializer:
Я реализовал свой собственный десериализатор:
public class MyJsonNullableDeserializer extends JsonNullableDeserializer {
private static final long serialVersionUID = 1L;
private boolean isBooleanDeserializer = false;
public JsonNullableDeserializer(JavaType fullType, ValueInstantiator inst,
TypeDeserializer typeDeser, JsonDeserializer<?> deser) {
....
}
}
@Override
public JsonNullable<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken t = p.getCurrentToken();
if (t == JsonToken.VALUE_STRING && isBooleanDeserializer && p.getText().trim().isEmpty() ) {
throw new IllegaArgumentException("....");
}
return super.deserialize(p, ctxt);
}
Теперь хочу зарегистрироваться MyJsonNullableDeserializer и не знаю как.
Я вижу класс JsonNullableDeserializers
public class JsonNullableDeserializers extends Deserializers.Base {
@Override
public JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType,
DeserializationConfig config, BeanDescription beanDesc,
TypeDeserializer contentTypeDeserializer, JsonDeserializer<?> contentDeserializer) {
return (refType.hasRawClass(JsonNullable.class)) ? new JsonNullableDeserializer(refType, null, contentTypeDeserializer,contentDeserializer) : null;
}
}
Похоже, мне придется заменить
JsonNullableDeserializer с MyJsonNullableDeserializer как-то
Я понятия не имею, как его заменить. Не могли бы вы помочь?
@Джон Уильямс Да, я использую Spring-Boot 3
Судя по вашему коду, вы хотите выдать исключение, если ожидаемое логическое значение представляет собой пустую строку. Это правда? Если да, то я считаю, что это можно сделать с помощью переопределенного JsonDeserializer<Boolean>, который легче зарегистрировать. Можете ли вы добавить пример входящего json, который должен завершиться ошибкой.
@Джон Уильямс Я думал об этом, но у меня в проекте много логических переменных, и я не хочу менять их поведение.




Я думаю, что objectmapper — это место, где мы регистрируем наши десериализаторы json. Если я ошибаюсь, я могу обновить ответ позже. Ниже представлена конфигурация Джексона.
@Configuration
public class JacksonConfig {
@Bean
public Module jsonNullableBooleanModule() {
SimpleModule module = new SimpleModule();
module.addDeserializer(JsonNullable.class, new CustomBooleanJsonNullableDeserializer());
return module;
}
}
и для регистрации используйте класс ниже
@Configuration
public class ObjectMapperConfig {
@Bean
@Primary
public ObjectMapper objectMapper(com.fasterxml.jackson.databind.Module jsonNullableBooleanModule) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(jsonNullableBooleanModule);
return objectMapper;
}
}
Вотрабочий пример.
Смогу попробовать через 48 часов. Примите заранее
не стесняйтесь писать сюда в случае каких-либо проблем, я могу поработать над этим через 48 часов
Вы используете фреймворк? например, весна