自动将requestMap的值装入bean中

SpringBoot API接口自动加解密实战:基于RequestBodyAdvice与ResponseBodyAdvice 在Web应用开发中,数据传输安全是保障用户隐私和业务合规性的基础。其核心原理在于对敏感信息进行加密处理,防止在传输过程中被窃取或篡改。对称加密算法AES因其加解密速度快、安全性高的特点,成为API接口传输层加密的常用技术。通过实现自动化的请求解密与响应加密,开发者可以在不修改业务逻辑代码的前提下,为系统提供透明的安全防护,有效提升工程效率与代码可维护性。Spring MVC框架提供的RequestBodyAdvice和ResponseBodyAdvice扩展点,正是实现这一技术价值的理想工具。它们允许开发者 阅读详情

package com.core.common;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

public class AutoLoadBean {
    private static Logger logger = LoggerFactory.getLogger(AutoLoadBean.class);

    private static String DATE_FORMAT_1 = "yyyy-MM-dd";

    private static String DATE_FORMAT_2 = "yyyy-MM-dd HH:mm:ss";

    private static String DATE_MATCHER_1 = "^\\d{4}(\\-)\\d{1,2}\\1\\d{1,2}$";

    private static String DATE_MATCHER_2 = "^\\d{4}(\\-)\\d{1,2}\\1\\d{1,2}(\\s([0-1]\\d|[2][0-3])\\:[0-5]\\d\\:[0-5]\\d)$";

    /**
     * 自动将requestMap的值装入bean中<br />
     * 如果requestMap里的值为空,则对应bean的属性也将被设置为空
     * 
     * @param bean :buan
     * @param requestMap :map
     * @return 更新好的bean
     * @throws NoSuchMethodException
     * @throws SecurityException
     */

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static <T> T load(T bean, Map<String, String[]> requestMap) throws NoSuchMethodException, SecurityException {
        // 获得类所有属性
        Field[] fields = bean.getClass().getDeclaredFields();

        // 开始循环属性
        for (Field field : fields) {

            // 获得请求参数名字集合
            Set<String> names = requestMap.keySet();

            // 开始循环请求参数
            for (String name : names) {
                String value = "";

                // 判断请求值属性名是否和需要绑定类的属性名一直
                if (!name.equals(field.getName())) {
                    continue;
                }

                // 防止file类型值提交
                try {
                    value = StringUtils.hasText(requestMap.get(name)[0]) ? requestMap.get(name)[0].trim() : "";
                } catch (Exception e) {
                    logger.debug("自动装入参数AutoLoadBean.load:根据" + name + "获得值失败");
                    continue;
                }

                // 取得对象属性名
                String fieldName = field.getName();

                // 获得参数类型
                Class cl = field.getType();

                // 拼装set方法名
                String setName = getSetMethodName(fieldName);

                // 获取相应的方法(符合 set 后 大写或者小写 的方法名)
                Method setMethod = null;
                try {
                    setMethod = bean.getClass().getMethod(setName, new Class[] { field.getType() });
                } catch (Exception e) {
                    setMethod = bean.getClass().getMethod("set" + fieldName, new Class[] { field.getType() });
                }

                try {

                    // 根据不同的系统对象转换
                    if (!StringUtils.hasText(value)) {
                        // 为空,则设置为空

                        setMethod.invoke(bean, new Object[] { null });

                    } else if (cl == String.class) {

                        // 为String
                        setMethod.invoke(bean, new Object[] { value });

                    } else if (cl == Byte.class || cl == Short.class || cl == Integer.class || cl == Long.class
                            || cl == Float.class || cl == Double.class || cl == Boolean.class || cl == Character.class) {

                        // 为 bytp,short,int,long,float,double,boolean,char
                        Method valueOf = cl.getMethod("valueOf", new Class[] { String.class });
                        Object valueObj = valueOf.invoke(cl, new Object[] { value });
                        setMethod.invoke(bean, new Object[] { valueObj });

                    }else if(cl == BigDecimal.class) {
                        BigDecimal b = new BigDecimal(value);
                        setMethod.invoke(bean, new Object[] { b });
                    } else if (cl == Date.class || cl == java.sql.Date.class) {
                        // 为date
                        String formatChar = null;

                        if (Pattern.compile(DATE_MATCHER_1).matcher(value).find()) {
                            formatChar = DATE_FORMAT_1;
                            // 分别2个默认的格式化规制
                        } else if (Pattern.compile(DATE_MATCHER_2).matcher(value).find()) {
                            formatChar = DATE_FORMAT_2;
                        }

                        if (formatChar != null) {
                            Date date = new SimpleDateFormat(formatChar).parse(value);
                            Object dateObj = cl.newInstance();
                            Method setTime = cl.getMethod("setTime", new Class[] { long.class });
                            setTime.invoke(dateObj, new Object[] { date.getTime() });
                            setMethod.invoke(bean, new Object[] { dateObj });
                        } else {
                            logger.warn("自动装入参数AutoLoadBean.load:自动转换日期格式失败,参数未绑定");
                            continue;
                        }

                    } else {
                        logger.warn("自动装入参数AutoLoadBean.load:未知数据类型,无法调用Set方法");
                        continue;
                    }

                    logger.debug("自动装入参数AutoLoadBean.load:属性" + fieldName + "绑定成功,值为:" + value);
                    break;
                } catch (Exception e) {
                    logger.warn("自动装入参数AutoLoadBean.load:设置值失败,属性类型为:" + field.getType().getSimpleName() + ",值为"
                            + value);
                }
            }
        }
        return bean;
    }

    /**
     * 返回属性的set方法
     * 
     * @param fieldName
     * @return
     */
    private static String getSetMethodName(String fieldName) {
        // 截取对象属性名的第一位,并且转换为大写
        String stringLetter = fieldName.substring(0, 1).toUpperCase();

        // 拼装set方法名
        String setName = "set" + stringLetter + fieldName.substring(1);

        logger.debug("自动装入参数AutoLoadBean.load:调用" + setName + "方法");

        return setName;
    }
}

 

Java JSON反序列化实战:从String到对象的完整指南与避坑 JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,已成为现代Web应用和微服务架构中数据传输的事实标准。其核心原理是将结构化的数据序列化为文本,便于网络传输和存储,再通过反序列化还原为程序中的对象。在Java生态中,这一过程的技术价值在于实现跨语言、跨平台的数据互通,是构建RESTful API、处理配置文件、对接第三方服务的基础能力。常见的应用场景包括前后端数据交互、消息队列通信、分布式缓存存储等。针对开发中高频出现的“如何将String类型的JSON字符串高效 阅读详情

相关推荐

若依框架集成JSEncrypt实现登录密码RSA加密传输完整指南

在前后端分离的Web应用开发中,数据传输安全是保障系统安全性的基石。HTTPS协议解决了传输通道的加密问题,但在数据到达服务器之前,敏感信息(如用户密码)仍可能面临被恶意脚本或中间人攻击截获的风险。非对称加密技术,特别是RSA算法,通过公钥加密、私钥解密的原理,为前端敏感数据加密提供了一种有效的解决方案。其技术价值在于,即使加密过程公开,攻击者也无法仅凭公钥反向破解密文,从而在HTTPS的基础上为数据传输增加了一层额外的安全保障。这一方案在金融、政务等对安全有严格要求的系统中应用广泛。本文聚焦于如何在流行的

weixin_30614109的博客 327

Spring Boot注解@RequestMapping、@RequestBody的详解

目录 1、@RequestMapping 1.1、 value, method; value/method 示例 1.2、 consumes,produces; consumes/produces 示例 1.3、 params,headers; params/headers 示例 2、@PathVariable 2.1、定义单个URL变量 2.2、定义多个URL变量 3...

拾一二的博客 5万+

Unity UGUI高斯模糊背景效果 简易解决方案

UnityUI背景模糊效果简易解决方案1.功能描述简易界面框架搭建合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 1.功能描述 在我们玩游戏的时候,经常会看到一些游戏会对UI做这样的处理: 可以看到,新开的上层UI界面会以下层UI界面的模糊

SaberZG的博客 1万+

request请求参数转bean对象(支持复杂格式)

request请求参数转bean对象(支持复杂格式)

Lin_林的博客 755

Halcon手眼标定实战:九点标定法从入门到精通(附完整代码)

本文详细介绍了Halcon环境下九点标定法的完整实现流程,从基础概念到实战技巧,帮助开发者快速掌握手眼标定技术。通过精确采集图像坐标与机械坐标,计算仿射变换矩阵,实现相机与机械臂坐标系的精确映射,适用于工业自动化中的平面定位场景。

v4w5x6的博客 411

Qi标准下的充电协议及其记忆技巧

记忆无线充电协议中的。

m0_73991989的博客 1319

SpringMVC 深度解析@RequestMapping(一)

SpringMVC作为一个MVC框架,有控制层,当我们在浏览器发出了一个请求,SpringMVC是怎么处理请求,而且通过请求找到对应的类的方法?我们今天带着这么问题来解析SpringMVC源代码处理过程。

在前进的路上 2万+

单目和多目视觉统一标定

单目和多目视觉统一标定 一.单目视觉标定 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在

吴建明wujianming_110117 2911

Java中将request中参数值自动赋值到JavaBean中

import java.lang.reflect.Method; import java.util.Date;   import javax.servlet.http.HttpServletRequest;   import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.St

2929

实验六 存储器实验

只读存储器(ROM)是一种在正常工作时其存储的数据固定不变,其中的数据只能读出,不能写入,即使断电也能够保留数据,要想在只读存储器中存入或改变数据,必须具备特定的条件。当地址为00000101时,会分别在数据位宽为8,16,32的只读寄存器中找到地址为00000101所对应的十进制地址位置,也就是地址为5的数据,并将其分别以8位,16位,32位输出。因此,输出保持为0。因此,当异步清零信号为1时,无论其他输入信号是什么,触发器的输出都会被强制清零,输出为0。1)寄存器输入0011,使能端1,异步清零0。

wenmou1111的博客 3001

西门子S7通信协议TSAP配置全攻略:从默认值到自定义修改(附各型号对照表)

本文深入解析西门子S7通信协议中TSAP配置的核心原理与实战方法。针对S7-200/300/400/1200/1500等主流PLC型号,提供了默认TSAP对照表,并详细阐述了如何根据机架号和插槽号计算或自定义Remote TSAP。文章结合常见连接失败案例,给出了系统化的排错流程,旨在帮助工程师快速打通S7通信链路,提升工业自动化现场调试效率。

weixin_29163797的博客 278

hutool使用

Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子。如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有。 参考文档: https://blog.youkuaiyun.com/qq_35946055/article/details/112257441 API: https://apidoc.gitee.com/dromara/hutool/ <dependency> <groupId>cn.hutool</groupId>

weixin_51304175的博客 3098

LeRobot X-VLA:首个适用于任意机器人、任意任务的软提示机器人基础模型

X-VLA是一种基于软提示的视觉-语言-动作模型,通过可学习嵌入向量编码不同机器人配置,实现跨平台统一控制。该框架采用两阶段训练:先在29万次多平台任务中学习通用策略,再通过微调少量参数(仅1%)适配新机器人。实验表明,0.9B参数的X-VLA在6个仿真和3个真实平台上表现优异,如LIBERO任务达93%成功率,布料折叠任务100%完成。其核心创新是将硬件差异视为"任务",用软提示引导Transformer处理异构数据,为机器人基础模型提供可扩展方案。

2506_90492529的博客 1241

托管 Bean 页面传值的使用方法和技巧(2)

MyBean1.java: package mypackage; import javax.faces.context.FacesContext; public class MyBean1 { // Using VariableResolver. NOTE: this is deprecated since JSF 1.2! public void action1...

iteye_20852的博客 202

我的python学习之路

Python 是一门功能强大且易于学习的编程语言,广泛应用于数据分析、人工智能、Web 开发、自动化等领域。以下是一个 Python 学习路径的总结,帮助你系统地掌握 Python 编程。

数据知道的博客 3万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Mvc @requestBody json字符串 转 javabean

public class BeanUtils { /** * 2 * map转bean * 3 * @param source map属性 * 4 * @param instance 要转换成的备案 * 5 * @return 该bean * 6 */ public static &lt;T&...

qq_34342170的博客 725

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JSF request参数传递

关键词   JSF  Request  传参   BEAN Request属性注入   1:JSF页面之间传参 方法1:                                               方法2:

爱代码 爱生活 3514

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Package javax.faces.annotation

Skip navigation links Overview Package Class Use Tree Deprecated Index Help Prev Package Next Package Frames No Frames Package javax.faces.annotation Annotations in this class allow injection of JS...

[Blog][Domain] programb.blog.youkuaiyun.com 396

大模型API安全实战:防御加密思维链旁路转录攻击

在AI应用开发中,API调用安全与数据隐私保护是核心议题。其原理在于,即使通信内容通过HTTPS等协议加密,系统运行时产生的元数据、时序信息和资源消耗模式仍可能构成“旁路信道”,泄露敏感信息。这直接关系到模型推理逻辑和用户数据的机密性,对于保障企业级AI服务的稳健运行至关重要。在诸如智能客服、代码生成和数据分析等应用场景中,此类风险尤为突出。本文聚焦于“加密思维链被旁路转录”这一具体威胁,深入剖析攻击者如何利用API错误信息(如`402 Insufficient Balance`)和响应时序差异来推断模型内

diaoju3333的博客 421

JAVA自定义注解(2)

这个例子在实际应用中是比较有用的,用来将配置文件(*.properties)或者系统属性中的指定属性名称的值加载进来 1、定义注解@Property package com.kute.test.selfannotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; impo

kutekute的专栏 2164

SpringMVC总结(四)--设置RequestMapping指定请求方式

本文内容来自尚硅谷 本文代码来SpringMVC总结(二)--SpringMVC的HelloWorld​​​​​​​   标准的http请求格式 修改java文件 由于这里指定了使用post请求所以,超链接访问不到该方法 超链接访问失败 报错 使用form表单提交就可以了 成功了  ...

秋天的猿 1万+

@RequestBody参数Map传参注意事项

文章目录@requestBody参数Map传参注意事项后端接收`dto` @requestBody参数Map传参注意事项 后端接收dto @Data public class TestDto{ ​ private String id; ​ private Map<String,String> map; } 注意: 当前端传递的参数类型Map是类似ES6中new Map()再set值这种最终的传参数据结构会发生改变,最终导致后端@requestBody 参数Map类型无法接收到参数。正确的做

dingwen 4013

java之增强request请求,统一使用map接受各种参数

增强的request package com.at.inspection.common.filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.UnsupportedEncodingException; imp...

学而不思则罔 1807

android Map遍历的四种方式

android Map遍历的四种方式1234来源 1 // 一、推荐只用value的时候用,都懂的。。。 // Map.values()遍历所有的value,不遍历key for (String v : map.values()) { System.out.println("value= " + v); } 2 // 二、取二次值,先取key再取value,建议只需要用...

杨迪龙的博客 2397

post请求request为流时,转化为map

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestString = getRequestPayload(request); Map<String,

zhanghuiyu01的博客 5331

将request中的所有参数存放到自定义的map中

/** * <获取参数map> * * @return 参数map * @throws Exception */ protected Map<String, Object> getParameterMap(HttpServletRequest request) throws Exception { Map<String,

zlzhaoe的博客 4094
上一篇: JSON转换工具类
下一篇: Eclipse 修改(重定向)SVN地址
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值