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

Spring服务端如何接收@PathVariable中包装对象的原始ID?

解决Spring服务端接收自定义@PathVariable包装对象的问题

当你用自定义Id类作为@PathVariable参数时,Spring MVC默认没有内置转换器能把路径中的字符串直接转换成Id对象,会 fallback 到调用对象的toString()方法,导致服务端收到的是字符串形式的对象,而非正确实例化的Id。另外先修正你的Id类代码笔误:setId方法里的this.Iid应该是this.id,否则属性赋值会失败。

具体解决方案:

1. 实现String到Id的转换器

创建一个转换器类,告诉Spring如何把路径字符串转换为Id对象:

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class StringToIdConverter implements Converter<String, Id> {
    @Override
    public Id convert(String source) {
        // 根据实际需求可以在这里添加格式校验逻辑
        return new Id(source);
    }
}

2. 注册转换器到Spring容器

如果是Spring Boot项目,上面的类加了@Component会被自动扫描注册。如果是传统Spring MVC,需要在配置类手动注册:

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToIdConverter());
    }
}

3. 修正Id类的错误与类型一致性

你的Id类存在两处问题:

  • setId方法的笔误:this.Iid → this.id
  • getId()返回类型是Long,但属性是String,类型不匹配,建议统一类型:
public class Id {
    private String id;

    public Id(String id) {
        this.id = id;
    }

    // 若ID是字符串类型,返回String;若是数字则把属性改为Long
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id; // 修正笔误
    }
}

4. Feign客户端调用注意事项

客户端通过Feign调用时,要确保传递的是Id对象的原始ID值,而非对象本身(否则Feign会把对象转为toString字符串传递):

// Feign接口示例
@FeignClient(name = "service-name")
public interface ServiceClient {
    @PostMapping("/save/{id}")
    void save(@PathVariable("id") String id);
}

// 调用时传入Id的原始值
serviceClient.save(id.getId());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:15:41