⚡⚡⚡⚡⚡⚡
⛈️问题描述
VO实体类自动转换驼峰 下面配置即可,但是很多情况是几个字段懒得写实体类返回一个map.这个是时候也希望可以返回已经转成驼峰命名的字段
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
🌦️方案一
🌀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();
}
}
- 可以看已经进入我这个转换器了,
- 启动也成功了,map转换成驼峰也没有问题
🌀@ConfigurationPropertiesBinding的作用
@ConfigurationPropertiesBinding
是 Spring Boot 中的一个注解,用于将自定义的转换器(Converter)注册为属性绑定的候选项。它可用于将外部属性绑定到 Spring 环境中的 Java 对象或 Bean 属性。
- 在 Spring Boot 应用中,通常会使用
@ConfigurationProperties
注解来绑定外部配置文件中的属性到一个 Java 对象。但是,当属性的类型与 Java 对象的属性类型不匹配时,就需要自定义转换器进行类型转换。- 使用
@ConfigurationPropertiesBinding
注解,你可以将自定义的转换器注册为属性绑定的候选项。这样,Spring 在属性绑定时会优先考虑候选项中的转换器。- 然后,你可以在需要的地方使用
@Autowired
注解来注入该转换器,或者在配置类中指定转换器的类型,以便在属性绑定时进行类型转换。- 注意:使用自定义转换器时,需要你的转换器类为
@Component
或其他 Spring 组件注解,以让 Spring 自动扫描并注册转换器,而无需显式定义配置类。
🌦️方案二(怕麻烦的建议使用方案二)
🌀通过Java配置bean解决
- 直接用下面的代码配置
用下面的配置的话记得把yml里面的删除掉
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: hrd
* @CreateTime: 2023/4/29 9:28
* @Description:
*/
@Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer mybatisConfigurationCustomizer(){
return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
}
}