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

带枚举值的PATCH请求在Postman中失效但Angular中正常

问题分析与解决方案

1. 检查Authorization请求头

你的Controller明确要求@RequestHeader(name = "Authorization"),Angular请求正常说明前端已正确携带Bearer Token,但Postman大概率遗漏了该头,或格式错误(未添加Bearer 前缀)。

  • 解决:在Postman的Headers标签中添加Authorization头,值为Bearer <你的Token内容>。

2. 确认请求体的Content-Type与格式

Angular的http.patch默认会设置Content-Type: application/json,但Postman若未正确配置请求体格式,会导致Spring无法解析:

  • 解决:在Postman的Body标签中选择raw,下拉框选JSON,再粘贴请求体{"mode": "M"};若尝试直接发送枚举值,需请求体为带引号的字符串(如"M"),同时保持Content-Type: application/json。

3. 修正枚举反序列化与Controller接收逻辑

当前ModeEnum用@JsonProperty标注了序列化值,但直接用@RequestBody ModeEnum mode接收包含mode字段的对象不符合常规反序列化逻辑(正常应直接接收枚举值字符串)。Angular请求成功可能依赖隐藏配置,但Postman未适配:

  • 方案1:确保封装对象的正确性(若之前尝试过但无效)
    创建标准Dto类:

    public class ModeRequestDto {
        private ModeEnum mode;
    
        public ModeEnum getMode() { return mode; }
        public void setMode(ModeEnum mode) { this.mode = mode; }
    }
    

    修改Controller接收该Dto:

    @PatchMapping("/mode/{numClient}")
    public Response<Object> mode(
           @PathVariable Integer numClient,
           @RequestBody ModeRequestDto modeRequest,
           @RequestHeader(name = "Authorization") String bearer
        ) throws BusinessException, NoSuchElementException {
        ModeEnum mode = modeRequest.getMode();
        // 业务代码
    }
    

    此时Postman发送{"mode": "M"}即可正常解析。

  • 方案2:自定义枚举反序列化器(适配多格式)
    若坚持直接接收ModeEnum,添加Jackson自定义反序列化器兼容两种请求格式:

    public class ModeEnumDeserializer extends JsonDeserializer<ModeEnum> {
        @Override
        public ModeEnum deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            JsonNode node = p.getCodec().readTree(p);
            // 支持直接传字符串"A"/"M",或{"mode": "A"/"M"}格式
            if (node.isTextual()) {
                return getEnumByCode(node.asText().charAt(0));
            } else if (node.has("mode")) {
                String modeStr = node.get("mode").asText();
                return getEnumByCode(modeStr.charAt(0));
            }
            throw new IllegalArgumentException("无效的模式值");
        }
    
        private ModeEnum getEnumByCode(Character code) {
            for (ModeEnum e : ModeEnum.values()) {
                if (e.getMode().equals(code)) {
                    return e;
                }
            }
            throw new IllegalArgumentException("无效的模式编码: " + code);
        }
    }
    

    给ModeEnum添加反序列化器注解:

    @JsonDeserialize(using = ModeEnumDeserializer.class)
    public enum ModeEnum {
        @JsonProperty("A")
        AUTOMATIQUE('A'),
        @JsonProperty("M")
        MANUEL('M');
    
        private final Character mode;
    
        private ModeEnum(Character mode) {
            this.mode = mode;
        }
    
        public Character getMode() {
            return this.mode;
        }
    }
    

4. 校验请求方法与路径

确认Postman使用PATCH方法,请求路径与Angular完全一致(如/mode/123),无拼写或参数错误。


内容的提问来源于stack exchange,提问作者Neyt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:21:27