如何使用Spring的BackendIdConverter处理嵌入式复合主键转换问题
问题解决方案
1. 解决Cannot resolve symbol 'BackendIdConverter'报错
BackendIdConverter是Spring Data REST模块提供的内置接口,不需要自行创建,报错原因是当前pom.xml缺少对应依赖,在dependencies节点添加如下依赖后刷新Maven即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency>
依赖导入完成后,即可正常导入该接口,对应全类名为org.springframework.data.rest.webmvc.spi.BackendIdConverter。
2. 解决复合主键类型转换报错问题
该报错是因为Spring没有识别到你编写的转换器,按以下步骤配置即可解决:
步骤1:完善转换器并交给Spring管理
假设你的VendorProductMappingPk包含vendorId、productId两个字段,字符串用_分隔,参考实现如下,必须加@Component注解让Spring扫描到该类:
import org.springframework.data.rest.webmvc.spi.BackendIdConverter; import org.springframework.stereotype.Component; import com.example.UI.entity.VendorProductMappingPk; import com.example.UI.entity.VendorProductMapping; import java.io.Serializable; @Component public class VendorProductMappingIdConverter implements BackendIdConverter { @Override public Serializable fromRequestId(String id, Class<?> entityType) { // 拆分请求字符串组装成复合主键对象 String[] idParts = id.split("_"); VendorProductMappingPk pk = new VendorProductMappingPk(); pk.setVendorId(Long.parseLong(idParts[0])); pk.setProductId(Long.parseLong(idParts[1])); return pk; } @Override public String toRequestId(Serializable source, Class<?> entityType) { // 复合主键转为拼接字符串 VendorProductMappingPk pk = (VendorProductMappingPk) source; return pk.getVendorId() + "_" + pk.getProductId(); } @Override public boolean supports(Class<?> type) { // 指定该转换器仅处理VendorProductMapping实体 return VendorProductMapping.class.equals(type); } }
步骤2:自定义Controller场景额外适配
如果你是在自己编写的Spring MVC接口中直接接收VendorProductMappingPk参数,需要额外实现Spring原生Converter接口并注册:
import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; @Component public class StringToVendorProductMappingPkConverter implements Converter<String, VendorProductMappingPk> { @Override public VendorProductMappingPk convert(String source) { String[] idParts = source.split("_"); VendorProductMappingPk pk = new VendorProductMappingPk(); pk.setVendorId(Long.parseLong(idParts[0])); pk.setProductId(Long.parseLong(idParts[1])); return pk; } }
Spring Boot会自动扫描带@Component注解的转换器并注册到转换服务,无需额外配置。
步骤3:前端传参格式匹配
a标签传递参数时按照拼接规则传值即可,示例:
<a href="/vendorProduct/detail?id=1001_20001">查看关联信息</a>
内容的提问来源于stack exchange,提问作者Shravana More
相关产品推荐
相关产品推荐

