Я написал собственный десериализатор JSON, и он работает, как и ожидалось, но моя проблема в том, что он всегда включен, потому что он определен на уровне конфигурации.
Я хочу отключить его для некоторой пользовательской аннотации на уровне метода или контроллера, чтобы он не работал при наличии этой аннотации, но когда нет аннотации, работает пользовательский десериализатор JSON.Это возможно ?
Мой код для десериализатора:
@Configuration
public class OwaspConfiguration extends WebMvcConfigurerAdapter{
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jsonConverter());
}
@Bean
public HttpMessageConverter<?> jsonConverter() {
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new DefaultJsonSerializer());
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
objectMapper.registerModule(module);
return new MappingJackson2HttpMessageConverter(objectMapper);
}
}
public class DefaultJsonSerializer extends JsonDeserializer<String> implements ContextualDeserializer {
public static final org.owasp.html.PolicyFactory POLICY_FACTORY = new HtmlPolicyBuilder().toFactory();
@Override
public String deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
String value = parser.getValueAsString();
if (StringUtils.isEmpty(value))
return value;
else {
String originalWithUnescaped = unescapeUntilNoHtmlEntityFound(value);
return unescapeEntities(POLICY_FACTORY.sanitize(originalWithUnescaped), true);
}
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property)
throws JsonMappingException {
return this;
}
private String unescapeUntilNoHtmlEntityFound(final String value) {
String unescaped = unescapeEntities(value, true);
if (!unescaped.equals(value))
return unescapeUntilNoHtmlEntityFound(unescaped);
else
return unescaped;
}
}