千家信息网

Spring JPA repository怎样自定义数据converter

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了Spring JPA repository怎样自定义数据converter,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们都知道在使用j
千家信息网最后更新 2026年11月03日Spring JPA repository怎样自定义数据converter

本篇文章为大家展示了Spring JPA repository怎样自定义数据converter,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

我们都知道在使用jpaRepository 里边的方法时,返回的数据格式要么是和数据库表映射的entity,要么是 Projection 接口,或者map,或者基本数据类型。如果想要自定义一个类来接收数据的话,就会抛出类型转换错误。有了需求就有了动力。

最近在做项目的时候,想复用vo类来接收 Repository的返回数据,可是spirngjpa不认,于是在百度一通无果后,开始debug执行过程。功夫不负有心人,找到了数据转换的方法。一切奥妙都在这个类里边 DefaultConversionService ,如下部分截图

也就说如果我自定义一个converter 并且把它注册到这个ConversionService 里边,那我就可以在我自己的convert里边'猥琐'欲为..

首先看截图的第一个方法,顾名思义 可以获取到他的共享的实例!这就很明显了,就是给我们开的一扇窗呀。话不多说,下面就是使用方法 和 我自定义的convert

//springboot 启动类    public static void main(String[] args) {        SpringApplication.run(Application.class, args);        ((DefaultConversionService) DefaultConversionService.getSharedInstance())                .addConverter(new MyConverter());    }//MyConverter.javaimport lombok.extern.slf4j.Slf4j;import org.springframework.core.convert.TypeDescriptor;import org.springframework.core.convert.converter.GenericConverter;import org.springframework.util.ConcurrentReferenceHashMap;import sun.reflect.misc.MethodUtil;import java.lang.reflect.Method;import java.math.BigInteger;import java.util.HashSet;import java.util.Map;import java.util.Set;import java.util.stream.Stream;/** * .自定义 对象转换器 *  */@Slf4jpublic class RdeConverter implements GenericConverter {    private final Map methodCache = new ConcurrentReferenceHashMap<>(2 >> 6);    private final CacheMethod NO_MATCH = new CacheMethod(null);    @Override    public Set getConvertibleTypes() {        ConvertiblePair pair = new ConvertiblePair(Map.class, RdeConvertible.class);        Set set = new HashSet<>();        set.add(pair);        return set;    }    @Override    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {        try {            log.debug("***begin convert {} to {}", sourceType, targetType);            Map map = (Map) source;            Object o = targetType.getType().newInstance();            for (Object fieldName : map.keySet()) {                String name = getMethodName(fieldName.toString());                String mName = o.getClass().getName().concat(".").concat(name);                CacheMethod cacheMethod = methodCache.get(mName);                if (cacheMethod == null) {                    //FIXME  如果存在方法重载 ,可能会存在异常                    Method method = Stream.of(MethodUtil.getPublicMethods(targetType.getType()))                            .filter(m -> m.getName().equalsIgnoreCase(name))                            .findFirst().orElse(null);                    cacheMethod = method == null ? NO_MATCH : new CacheMethod(method);                    methodCache.put(mName, cacheMethod);                }                if (cacheMethod != NO_MATCH) {                    try {                        Method method = cacheMethod.get();                        method.invoke(o, caseParam(map.get(fieldName), method.getParameterTypes()[0]));                    } catch (Exception e) {                        log.error(e.getMessage(), e);                    }                }            }            return o;        } catch (Exception e) {            log.error(e.getMessage(), e);        }        return null;    }    private Object caseParam(Object param, Class paramType) {        if (param instanceof BigInteger) {            if (param.getClass() == paramType) {                return param;            }            if (paramType == Integer.class) {                return ((BigInteger) param).intValue();            }            if (paramType == Long.class) {                return ((BigInteger) param).longValue();            }            return param;        }        return param;    }    private String getMethodName(String fieldName) {        String[] s = fieldName.trim().split("_");        if (s.length > 1) {            String m = Stream.of(s).reduce((a, b) -> firstToUp(a) + firstToUp(b)).get();            return "set".concat(m);        }        return "set".concat(firstToUp(s[0]));    }    private String firstToUp(String s) {        if (s.length() > 1) {            return s.substring(0, 1).toUpperCase().concat(s.substring(1));        }        return s.toUpperCase();    }    class CacheMethod {        private Method method;        CacheMethod(Method method) {            this.method = method;        }        Method get() {            return this.method;        }    }}//RdeConvertible.java/** * .转换类型标记 * */public interface RdeConvertible {}

使用截图:

上述内容就是Spring JPA repository怎样自定义数据converter,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

数据 方法 就是 截图 类型 内容 技能 知识 要么 明显 简明 猥琐 顾名思义 功夫不负有心人 简明扼要 使用方法 功夫 动力 奥妙 实例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津市摩尔互联网科技 互联网科技公司税收优惠 智能科技公司是互联网公司吗 互联网科技未来 善班互联网科技 碳银互联网科技 互联网 新科技 多迪互联网科技有限公司 哈尔滨秒房互联网科技有限公司 晓花互联网科技有限公司网址 宜昌元轩互联网科技有限公司 玉溪互联网科技怎么选 爱医互联网络科技 合肥互联网科技公司公章图片 黑科技 体验场景 互联网大会 智帮互联网科技公司最近动向 启辰互联网科技 互联网公司属于科技吗 重庆科技产业互联网有哪些 如何强化互联网金融科技 南京欣网互联网络科技有限公司 互联网公司 科技公司 深圳科技互联网 互联网科技金融公司 哈尔滨秒房互联网科技有限公司 天速互联网络科技有限公司 互联网还是高科技吗 互联网科技人工智能实验室 新氧科技和美国互联网有关系吗 互联网 科技节活动 微视频大赛
0