带枚举值的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
相关产品推荐
相关产品推荐

