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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:51:01