JavaWeb之如何把请求数据转成实体类
JavaWeb之如何把请求数据转成实体类
- 自己写个工具类加入下面两个静态方法
- 自定一个注解类DateTimeFormatting
- 调用方式
User user = util.ObjectFromMap(req.getParameterMap(), User.class) - 暂时支持8种基本数据类型对应包装类、
BigDecimal、java.util.Date,可应对大多情况,如有需求,可以自己添加 - 暂不支持数组
public static <T> T ObjectFromMap(Map<String,String[]> map, Class<T> type) {
try {
// 创建返回对象,是要转换的对象
T t = type.getConstructor().newInstance();
// 遍历map集合
for (Map.Entry<String, String[]> entry : map.entrySet()) {
// 获得属性名
String key = entry.getKey();
// 获得属性值
String[] values = entry.getValue();
// 自定义方法
// 如果类中没有这个属性跳出[本次]循环
if (!checkObjectHasField(type,key)) {
continue;
}
// 获取属性描述对象,如果类中没有这个属性,报异常,所以要有上面那个操作
PropertyDescriptor pd = new PropertyDescriptor(key,type);
// 获取属性的set方法,所以对应属性要有set方法
Method method = pd.getWriteMethod();
// 暂时不支持数组
String value = values[0];
// req获取的值都是字符串,所以在对非字符串类型要转换
// 获取属性的类型
String propertyType = pd.getPropertyType().getName();
// 如果字符串长度为0 说明空串,valueOf会转换失败
if(value.length() > 0) {
switch (propertyType) {
case "java.lang.Byte":
method.invoke(t, Byte.valueOf(value));
break;
case "java.lang.Integer":
method.invoke(t, Integer.valueOf(value));
break;
case "java.lang.Short":
method.invoke(t, Short.valueOf(value));
break;
case "java.lang.Long":
method.invoke(t, Long.valueOf(value));
break;
case "java.lang.Float":
method.invoke(t, Float.valueOf(value));
break;
case "java.lang.Double":
method.invoke(t, Double.valueOf(value));
break;
case "java.lang.Boolean":
method.invoke(t, Boolean.valueOf(value));
break;
case "java.lang.Character":
method.invoke(t, value.charAt(0));
break;
case "java.lang.String":
method.invoke(t, value);
break;
case "java.math.BigDecimal":
method.invoke(t, new BigDecimal(value));
break;
case "java.util.Date":
// 默认使用格式化日期的格式
String format = "yyyy-MM-dd";
// 获取属性对象
Field field = type.getDeclaredField(key);
// 通过属性对象获取 DateTimeFormatting 注解
// 自定义注解
DateTimeFormatting anno = field.getAnnotation(DateTimeFormatting.class);
// 检查注解存在否
if (anno != null) {
// 存在使用注解的 value 来格式化时间
// 不存在使用上面的默认格式
format = anno.value();
}
method.invoke(t, new SimpleDateFormat(format).parse(value));
break;
default:
break;
}
} else {
// 如果字符串是空串,那么转成的bean对象对应属性也给个空串
// 如果想给null可以去掉
if (propertyType.equals("java.lang.String")) {
method.invoke(t, value);
}
}
}
return t;
} catch (InstantiationException | IllegalAccessException
| InvocationTargetException | NoSuchMethodException
| IntrospectionException | NoSuchFieldException e
| ParseException e) {
e.printStackTrace();
}
return null;
}
- 校验对象中是否有指定属性
/**
* 校验对象中是否有指定属性
* @param type 对象的类型
* @param fieldName 属性名
* @return 是/否
*/
public static boolean checkObjectHasField(Class type,String fieldName) {
Field[] fields = type.getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals(fieldName)) {
return true;
}
}
return false;
}
DateTimeFormatting注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateTimeFormatting {
String value() default "yyyy-MM-dd";
}
JavaWeb之如何把请求数据转成实体类的更多相关文章
- 使用反射将DataTable的数据转成实体类
利用反射避免了硬编码出现的错误,但是实体类的属性名必须和数据库名字对应(相同) 1.利用反射把DataTable的数据写到单个实体类 /// <summary> ///利用反射把DataT ...
- 【转】C#中将JSon数据转换成实体类,将实体类转换成Json
http://wo13145219.iteye.com/blog/2022667 http://json2csharp.chahuo.com/ using System; using System.C ...
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- C# 将DataTable数据源转换成实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; /// < ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
阅读目录 1. 通过HttpServletRequest获得请求参数和数据 2. 处理方法形参名==请求参数名 3. 如果形参名跟请求参数名不一样怎么办呢?用@RequestParam注解 4. 用实 ...
- 0056 Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
浏览器总会向服务器传递一些参数,那么Spring MVC如何接收这些参数? 先写个简单的html,向服务器传递一些书籍信息,如下: <!DOCTYPE html> <html> ...
- python中操作excel数据 封装成一个类
本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...
随机推荐
- 多线程常用代码 Future Callable Runable
public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { E ...
- lombok的@builder 不能新建DO对象 Lombok存在的一些问题
1. 实体类加上 lombok的@builder之后 就不能新建对象了,,,构造函数被覆盖了? 加上两个标签之后解决 2.Lombok存在的一些问题 lombok问题 @Builder和@NoArg ...
- hook(v16.7测试)?
在无状态组件(如函数式组件)中也能操作state以及其他react特性, 通过useState
- swagger-ui提交请求无name(指input中的name属性)值
swagger-ui提交请求,请求不包含name值,造成后台无法进行接受参数. @Operation(description = "上传文件",tags = "上传&qu ...
- 如何用 Java 代码列出一个目录下所有的文件?
如果只要求列出当前文件夹下的文件,代码如下所示: import java.io.File; class Test12 { public static void main(String[] args) ...
- 什么是 spring bean?
它们是构成用户应用程序主干的对象. Bean 由 Spring IoC 容器管理. 它们由 Spring IoC 容器实例化,配置,装配和管理. Bean 是基于用户提供给容器的配置元数据创建.
- linux文本编辑器vim详解
vim 1.打开文件 vim [option] - file... 打开文件 +# 打开文件后,让光标处于第#行的行首 +/字符串 打开文件后,光标处于第一个被匹配到字符串的行首 -b file 二进 ...
- 3_一起燃烧卡路里/科学减肥(1)_系统分析实例_数学建模部分_Matlab/Simulink
- CSS3渐变效果工具
推荐一个css3渐变效果工具,觉得有帮助的可以收藏下. 工具链接 CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡.CSS3 定义了两种类型的渐变(gradient ...
- java string中replaceAll替换特殊符号
例如在mysql数据库中建表时表名不能使用特殊符号,'-','{}'等等,所以我们要筛选去掉 public static void main(String[] args) { String regEx ...