Динамическая загрузка Spring / пользовательский десериализатор JSON - PullRequest
0 голосов
/ 20 января 2019

Я написал собственный десериализатор 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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...