1.最近遇到了一个需求:导入用户信息Excel,需要将属性值:男、女,存入到数据库的时候是0、1这样的code码
2.最简单的解决方式就是if-else… ,需要转code码的属性少可以使用,多的话就比较麻烦了。
3.于是就一通搜索,写出了适合自己需求一个方法
一、话不多说,看效果(后端将男转换为0)demo地址
二、解决思路
1、通过注解标注需要转换的值
2、通过反射获取注解属性值和需要转换的值
1)、maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.15</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
2)、编写注解
/**
* @author tianzhuang
* @version 1.0
* @date 2022/1/7 22:28
*/
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
public @interface MyAnnotation {
/**
* 转换的值
*
* @return
*/
String readConverterExp() default "";
}
3)、编写反射工具类
/**
* @author tianzhuang
* @version 1.0
* @date 2022/1/11 12:17
*/
public class ChangValue {
/**
* 通过注解反射更新属性的值
*
* @param objVal
* @throws IllegalAccessException
*/
public static <T> void getValByClass(T objVal) throws IllegalAccessException {
Class<? extends T> aClass = (Class<? extends T>) objVal.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
if (declaredFields[i].isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = declaredFields[i].getAnnotation(MyAnnotation.class);
// 获取注解中readConverterExp字符串值
String s = annotation.readConverterExp();
// 设置权限
declaredFields[i].setAccessible(true);
// 获取属性值
Object val = declaredFields[i].get(objVal);
if (ObjectUtil.isNotNull(val)) {
// 将值进行匹配,如果匹配就更新为code,不匹配还更新为原来的值进行校验
// 这里可以自定义不匹配的情况下制空或者其他
Object obj = reverseByExp(String.valueOf(val), s);
// 如果val不为空,更新属性值
declaredFields[i].set(objVal, obj);
Object o = declaredFields[i].get(objVal);
}
}
}
}
/**
* 反向解析值 0=男,1=女
*
* @param propertyValue 参数值
* @param converterExp 翻译注解
* @return 解析后值,如果存在,则返回对应的值,不存在就返回原始值
*/
public static Object reverseByExp(String propertyValue, String converterExp)
{
if (StringUtils.isBlank(propertyValue)) {
return null;
}
Map<String, Object> map = new HashMap<>(16);
String[] convertSource = converterExp.split(",");
for (String item : convertSource)
{
String[] itemArray = item.split("=");
map.put(itemArray[1], itemArray[0]);
}
if (!map.isEmpty()) {
if (map.containsKey(propertyValue)) {
return map.get(propertyValue);
}
return propertyValue;
}
return propertyValue;
}
}
4)、自定义实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyUser {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
@MyAnnotation(readConverterExp = "0=男,1=女")
private String gender;
}
5)、编写controller(这里用的springboot)
/**
* @author tianzhuang
* @version 1.0
* @date 2022/1/7 22:24
*/
@RestController
@RequestMapping("test")
public class MyAnnotationController {
@PostMapping("getName")
public String test(@RequestBody MyUser user) {
try {
ChangValue.getValByClass(user);
return "test"+ user.toString();
} catch (Exception e) {
return "error";
}
}
@PostMapping("getName2")
public String test(@RequestBody Student student) {
try {
ChangValue.getValByClass(student);
return "test"+ student.toString();
} catch (Exception e) {
return "error";
}
}
}
6)、用postman请求:
地址:localhost:8080/test/getName2
参数:
{
"name": "zhangsan",
"gender": "女"
}
7)、解决~~~
我是Tz,想把我遇到的问题都分享给你~~~
想看更多精彩内容,请关注我的微信公众号