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.idgetId()返回类型是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
相关产品推荐
相关产品推荐

