(亲测有效)mybatis-puls 返回map下划线自动转成驼峰

文章目录

  • 问题描述
    • 1️⃣yml配置解决方案
      • ✏️错误分析
      • ✏️解决方案(转换器代码)
        • ️@ConfigurationPropertiesBinding的作用
    • 2️⃣通过Java配置bean解决 (觉得第一种麻烦的直接用第二种)

问题描述


VO实体类自动转换驼峰 下面配置即可,但是很多情况是几个字段懒得写实体类返回一个map.

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true

1️⃣yml配置解决方案


在网上找到说配置下面的即可,但是的配置上就启动报错

mybatis-plus:
  configuration:
    object-wrapper-factory: com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory

✏️错误分析


***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'mybatis-plus.configuration.object-wrapper-factory' to org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory:

    Property: mybatis-plus.configuration.object-wrapper-factory
    Value: "com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory"
    Origin: class path resource [application.yml] - 25:29
    Reason: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory]

Action:

Update your application's configuration

我们来错误分析一下

  • 关键这个一段No converter found capable of converting from type [java.lang.String] to type [org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory]
  • 翻译一下: 找不到对应的转换器将string转化为ObjectWrapperFactory对象,
  • 因为我这里当时比较着急解决这个问题,就是没有深究为什么会没有这个转换器
  • 直接就进入下一步,我们自己写一个对象转换器

✏️解决方案(转换器代码)


import lombok.SneakyThrows;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

/**
 * @Author: hrd
 * @CreateTime: 2023/7/5 17:17
 * @Description:
 */
@Component
@ConfigurationPropertiesBinding
public class StringToObjectWrapperFactoryConverter implements Converter<String, ObjectWrapperFactory> {
    @SneakyThrows
    @Override
    public ObjectWrapperFactory convert(String source) {

        return (ObjectWrapperFactory) Class.forName(source).newInstance();

    }
}

(亲测有效)mybatis-puls 返回map下划线自动转成驼峰_第1张图片

  • 可以看已经进入我这个转换器了,
  • 启动也成功了,map转换成驼峰也没有问题

️@ConfigurationPropertiesBinding的作用


@ConfigurationPropertiesBinding 是 Spring Boot 中的一个注解,用于将自定义的转换器(Converter)注册为属性绑定的候选项。它可用于将外部属性绑定到 Spring 环境中的 Java 对象或 Bean 属性。

  • 在 Spring Boot 应用中,通常会使用 @ConfigurationProperties 注解来绑定外部配置文件中的属性到一个 Java 对象。但是,当属性的类型与 Java 对象的属性类型不匹配时,就需要自定义转换器进行类型转换。
  • 使用 @ConfigurationPropertiesBinding 注解,你可以将自定义的转换器注册为属性绑定的候选项。这样,Spring 在属性绑定时会优先考虑候选项中的转换器。
  • 然后,你可以在需要的地方使用 @Autowired 注解来注入该转换器,或者在配置类中指定转换器的类型,以便在属性绑定时进行类型转换。
  • 注意:使用自定义转换器时,需要你的转换器类为 @Component 或其他 Spring 组件注解,以让 Spring 自动扫描并注册转换器,而无需显式定义配置类。

2️⃣通过Java配置bean解决 (觉得第一种麻烦的直接用第二种)


  • 直接用下面的代码配置用下面的配置的话记得把yml里面的删除掉
	@Bean
	public ConfigurationCustomizer mybatisConfigurationCustomizer(){
		return new ConfigurationCustomizer() {
			@Override
			public void customize(MybatisConfiguration configuration) {
				configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
			}
		};
	}

你可能感兴趣的:(日常问题记录,mybatis)