我们编写了一个Springboot Rest Service,它内部使用Jackson对Rest API的Json输入/输出进行序列化/反序列化。
对于 API 输入/输出,我们不希望将原语与字符串进行类型转换。
我们已经禁用了字符串到基元的转换,使用
spring.jackson.mapper.allow-coercion-of-scalars=false
但原始到字符串的转换仍然是允许的。
e.g.
"name": 123,
来自 API 仍被反序列化为"123"
,Java数据类型name
is String
here.
我们已经经历过自定义 Jackson ObjectMapperSpring 文档的部分,看起来这些枚举中没有任何可以使用的东西。
有没有一种方法可以在不编写自定义 ObjectMapper/反序列化器的情况下实现此目的?
我们没有找到任何可以实现此目的的配置属性,最后采用了发布的解决方案米哈乌·齐奥贝尔.
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;
// ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)