【问题标题】:Prevent Primitive To String Conversion in SpringBoot / Jackson防止 Spring Boot / Jackson 中的基元到字符串转换
【发布时间】:2021-04-13 08:27:38
【问题描述】:

我们编写了一个 Springboot Rest Service,它在内部使用 Jackson 对 Rest API 的 Json 输入/输出进行序列化/反序列化。

我们不希望 API 输入/输出的基元到/从 String 的类型转换。

我们已经禁用了字符串到基元的转换

spring.jackson.mapper.allow-coercion-of-scalars=false

但仍允许将 Primitive 转换为 String。

例如

"name": 123,

从 API 仍然反序列化为 "123"name 的 Java 数据类型在这里是 String

我们已经浏览了 Spring Docs 的 Customize the Jackson ObjectMapper 部分,看起来这些枚举中没有任何可以使用的东西。

有没有办法在不编写自定义 ObjectMapper / Deserializer 的情况下实现这一点?

【问题讨论】:

  • 看看我对这个问题的回答Restrict string data type to only string types for request body in Spring boot 2.4 (Jackson)。您需要注册自定义反序列化器,它会为标量值抛出异常。
  • @MichałZiober :您的解决方案有效,尽管稍作修改。 token.isBoolean() || token.isNumeric() || !token.toString().equalsIgnoreCase("VALUE_STRING") 由于字符串本身是一个标量,因此您的解决方案原样不适用于任何标量类型,包括字符串。如果您可以发布您的评论作为答案,可以接受它作为解决方案。

标签: spring-boot jackson jackson-databind


【解决方案1】:

我们没有找到任何实现这一点的配置属性,最后选择了Michał Ziober发布的解决方案。

package xyz;

import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.core.JsonToken;

import java.io.IOException;

public class StrictStringDeserializer extends StringDeserializer {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonToken token = p.currentToken();
        if (token.isBoolean()
                || token.isNumeric()
                || !token.toString().equalsIgnoreCase("VALUE_STRING")) {
            ctxt.reportInputMismatch(String.class, "%s is not a `String` value!", token.toString());
            return null;
        }
        return super.deserialize(p, ctxt);
    }
}



POJO 类

public class XyzAbc {

    // ...
    @JsonDeserialize(using = StrictStringDeserializer.class)
    private String name;
    // ...
}

【讨论】:

  • 很高兴看到您找到了解决方案并改进了实施。我没有时间将此作为答案发布并检查您的建议。如果有帮助,您可以随时为我的其他答案投票。
猜你喜欢
  • 2023-03-09
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2014-09-04
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多