You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:针对单个字段配置严格反序列化

如果仅需对特定字段做限制,无需全局修改,可以自定义反序列化器并应用到目标字段:

  1. 编写自定义字符串反序列化器
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();
    }
}
  1. 在实体类字段上应用该反序列化器
@Getter
@Setter
public class ExampleBody {

    @NonNull
    @JsonDeserialize(using = StrictStringDeserializer.class)
    private String barcode;
}

配置后,只有当barcode是JSON字符串类型时才能通过反序列化,数字类型会触发异常。


内容的提问来源于stack exchange,提问作者Oğuz Öztınaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:22:54