Spring Boot如何强制RequestBody仅接受字符串类型参数?
解决Spring Boot接口强制接收字符串类型字段的问题
问题原因
默认情况下,Jackson反序列化的ACCEPT_NUMERIC_AS_STRING特性是开启的,它会自动将JSON中的数字类型值转换为字符串类型字段,导致你的接口接收数字时不会触发异常。
解决方案
方案1:全局禁用数字转字符串的自动转换
通过配置Jackson全局关闭该特性,所有字符串类型字段都将拒绝数字输入:
方式1:使用配置文件(application.yml)
spring: jackson: deserialization: accept-numeric-as-string: false
方式2:使用Java配置类
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 禁用数字自动转字符串的特性 objectMapper.disable(DeserializationFeature.ACCEPT_NUMERIC_AS_STRING); return objectMapper; } }
配置生效后,当请求体传入数字类型的barcode时,接口会抛出JsonMappingException异常,返回400 Bad Request。
方案2:针对单个字段配置严格反序列化
如果仅需对特定字段做限制,无需全局修改,可以自定义反序列化器并应用到目标字段:
- 编写自定义字符串反序列化器
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; public class StrictStringDeserializer extends StdDeserializer<String> { public StrictStringDeserializer() { super(String.class); } @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 仅接受JSON字符串类型的输入 if (p.getCurrentToken() != JsonToken.VALUE_STRING) { throw ctxt.weirdStringException(p.getText(), String.class, "字段仅接受字符串类型"); } return p.getText(); } }
- 在实体类字段上应用该反序列化器
@Getter @Setter public class ExampleBody { @NonNull @JsonDeserialize(using = StrictStringDeserializer.class) private String barcode; }
配置后,只有当barcode是JSON字符串类型时才能通过反序列化,数字类型会触发异常。
内容的提问来源于stack exchange,提问作者Oğuz Öztınaz
相关产品推荐
相关产品推荐

