【问题标题】:Spring boot dynamic/annotation custom JSON deserializerSpring boot 动态/注解自定义 JSON 反序列化器
【发布时间】:2019-06-14 00:22:12
【问题描述】:

我已经编写了自定义 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;
    }

}

【问题讨论】:

标签: json spring spring-boot jackson deserialization


【解决方案1】:

使用@JsonDeserialize - 注释用于配置反序列化方面,通过附加到“setter”方法或字段或值类

在你的 DTO 中

@JsonDeserialize(using = StringDeserializer.class)
public String heading;

反序列化器类

public class StringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return p.getValueAsString();
    }

}

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 2015-02-17
    • 2017-01-30
    • 2021-11-27
    • 1970-01-01
    • 2019-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多