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

Spring Boot 3.0.0+拆分独立Controller后DTO反序列化报错求助

问题解决:独立Controller报错 + 枚举小写序列化/反序列化实现

一、独立Water4AgriFoodMockController报错解决

可能原因及修复步骤

  1. 包扫描范围问题
    Spring Boot默认仅扫描启动类(标注@SpringBootApplication)所在包及其子包中的组件。如果独立Controller不在该范围内,Spring无法识别它:
  • 方案1:将Water4AgriFoodMockController移动到启动类的子包下(例如启动类在org.crea.w4ag_mock,Controller放到org.crea.w4ag_mock.controller)
  • 方案2:在启动类上扩展包扫描范围:
@SpringBootApplication
@ComponentScan(basePackages = {"org.crea.w4ag_mock", "你的Controller所在包路径"})
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}
  1. Controller注解缺失
    确保Water4AgriFoodMockController类上标注了正确的Spring MVC注解:
@RestController
@RequestMapping("/your-api-path") // 替换为实际请求路径
public class Water4AgriFoodMockController {

    @GetMapping("/test")
    public String testParams(ParamsDTO paramsDTO) {
        // 业务逻辑
        return "Success";
    }
}
  • 必须添加@RestController(或@Controller配合@ResponseBody),否则Spring不会将其识别为请求处理控制器;
  • @RequestMapping或@GetMapping等路径注解要确保请求路径与Postman中调用的路径一致。
  1. 请求参数绑定问题
    GET请求中传递JSON参数通常需要将JSON转为URL编码,同时要确保参数名与ParamsDTO的字段名严格匹配:
  • 检查Postman中传递的参数名(例如timeFramesEnum)是否与DTO字段名一致;
  • 如果使用@RequestParam手动绑定参数,要确保每个参数都正确映射到DTO字段,或者直接使用ParamsDTO作为方法参数(Spring会自动通过@ModelAttribute绑定)。

二、枚举TimeFramesEnum的小写序列化/反序列化实现

方案:使用Jackson注解自定义枚举的序列化/反序列化逻辑

修改TimeFramesEnum类,添加@JsonValue(控制序列化输出)和@JsonCreator(控制反序列化输入):

package org.crea.w4ag_mock.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public enum TimeFramesEnum {
    BASELINE("baseline"),
    PERIOD2_2040("period2_2040"),
    PERIOD3_2070("period3_2070"); // 修正原枚举中的笔误:PERIOD2_2070 -> PERIOD3_2070

    private final String lowerCaseValue;

    TimeFramesEnum(String lowerCaseValue) {
        this.lowerCaseValue = lowerCaseValue;
    }

    // 序列化时输出小写字符串
    @JsonValue
    public String getLowerCaseValue() {
        return lowerCaseValue;
    }

    // 反序列化时接受小写(或大小写不敏感)的字符串
    @JsonCreator
    public static TimeFramesEnum fromValue(String value) {
        for (TimeFramesEnum enumVal : TimeFramesEnum.values()) {
            if (enumVal.lowerCaseValue.equalsIgnoreCase(value.trim())) {
                return enumVal;
            }
        }
        throw new IllegalArgumentException("无效的时间框架类型: " + value);
    }
}
  • 序列化:当ParamsDTO被转为JSON时,timeFramesEnum字段会输出对应的小写字符串(例如baseline);
  • 反序列化:当请求中传递小写(或混合大小写)的字符串(例如baseline、BASELINE)时,会自动映射到对应的枚举值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:03