前后端传递参数不一致

常用的串口通信工具MobaXterm、Bus Hound、SScom等 本文介绍了四种PC端串口通信工具的功能和使用方法:MobaXterm支持SSH、FTP、串口等多种协议;Bus Hound用于监控CAN和串口数据;SScom专为串口和网口通信设计;ScriptCommunicator可进行串口通信并绘制波形图。每种工具都有详细的操作步骤图示,包括参数设置、数据监控等关键功能,并提供了官方和个人下载地址。这些工具各有特点,适用于不同的串口通信和数据分析场景。 阅读详情

描述:实体类有一个字段deviceId,前端传递参数为device_id
代码下载地址:https://download.youkuaiyun.com/download/activety/12462144
目录结构:
在这里插入图片描述

VO类

@Data
public class Vo{

    private Integer id;

    @ParamName("device_id")
    private String deviceId;

}

Controller类

@RestController
public class Controller {
    /**
     * @param job
     * @RequestParam这个注解非常重要
     */
    @RequestMapping("/aa")
    @ResponseBody
    public String test(@RequestParam Vo job) {
        System.out.println(job.toString());
        return job.toString();
    }
}

自定义注解ParamName

@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamName {
    String value();
}

ParamNameDataBinder

import org.springframework.beans.MutablePropertyValues;
import org.springframework.web.servlet.mvc.method.annotation.ExtendedServletRequestDataBinder;

import javax.servlet.ServletRequest;
import java.util.Map;

public class ParamNameDataBinder extends ExtendedServletRequestDataBinder {

    private final Map<String, String> paramMappings;

    public ParamNameDataBinder(Object target, String objectName, Map<String, String> paramMappings) {
        super(target, objectName);
        this.paramMappings = paramMappings;
    }

    @Override
    protected void addBindValues(MutablePropertyValues mutablePropertyValues, ServletRequest request) {
        super.addBindValues(mutablePropertyValues, request);
        for (Map.Entry<String, String> entry : paramMappings.entrySet()) {
            String paramName = entry.getKey();
            String fieldName = entry.getValue();
            if (mutablePropertyValues.contains(paramName)) {
                mutablePropertyValues.add(fieldName, mutablePropertyValues.getPropertyValue(paramName).getValue());
            }
        }
    }
}

ParamNameProcessor

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class ParamNameProcessor extends ServletModelAttributeMethodProcessor {

    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    private static final Map<Class<?>, Map<String, String>> PARAM_MAPPINGS_CACHE = new ConcurrentHashMap<>(256);

    public ParamNameProcessor() {
        super(false);
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(RequestParam.class)
                && !BeanUtils.isSimpleProperty(parameter.getParameterType())
                && Arrays.stream(parameter.getParameterType().getDeclaredFields())
                .anyMatch(field -> field.getAnnotation(ParamName.class) != null);
    }

    @Override
    protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest nativeWebRequest) {
        Object target = binder.getTarget();
        Map<String, String> paramMappings = this.getParamMappings(target.getClass());
        ParamNameDataBinder paramNameDataBinder = new ParamNameDataBinder(target, binder.getObjectName(), paramMappings);
        requestMappingHandlerAdapter.getWebBindingInitializer().initBinder(paramNameDataBinder, nativeWebRequest);
        super.bindRequestParameters(paramNameDataBinder, nativeWebRequest);
    }

    /**
     * @param targetClass
     * @return {@link Map<String, String>}
     */
    private Map<String, String> getParamMappings(Class<?> targetClass) {
        if (PARAM_MAPPINGS_CACHE.containsKey(targetClass)) {
            return PARAM_MAPPINGS_CACHE.get(targetClass);
        }
        Field[] fields = targetClass.getDeclaredFields();
        Map<String, String> paramMappings = new HashMap<>(32);
        for (Field field : fields) {
            ParamName paramName = field.getAnnotation(ParamName.class);
            if (paramName != null && !paramName.value().isEmpty()) {
                paramMappings.put(paramName.value(), field.getName());
            }
        }
        PARAM_MAPPINGS_CACHE.put(targetClass, paramMappings);
        return paramMappings;
    }

}

WebConfig

mport com.example.demo.annotation.ParamName;
import com.example.demo.annotation.ParamNameProcessor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class WebConfig {
    @Bean
    protected ParamNameProcessor paramNameProcessor() {
        return new ParamNameProcessor();
    }

    @Bean
    public BeanPostProcessor beanPostProcessor() {
        return new BeanPostProcessor() {

            @Override
            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                return bean;
            }

            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof RequestMappingHandlerAdapter) {
                    RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean;
                    List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(adapter.getArgumentResolvers());
                    argumentResolvers.add(0, paramNameProcessor());
                    adapter.setArgumentResolvers(argumentResolvers);
                }
                return bean;
            }
        };
    }
}

XML

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

测试结果:在这里插入图片描述

DAC8568控制器实战:如何用STM32实现多通道同步输出(附完整代码) 本文详细介绍了如何使用STM32微控制器驱动TI的DAC8568多通道DAC控制器,实现高精度的多通道同步模拟信号输出。内容涵盖硬件设计要点、SPI时序精准配置、驱动层命令构建,并重点解析了通过LDAC引脚实现同步更新的核心策略,提供了完整的代码框架和实战案例,帮助工程师快速解决多通道同步输出的工程难题。 阅读详情

相关推荐

从原理到实践:手把手教你如何校准和使用六维力传感器(附常见问题排查)

本文详细解析六维力传感器的工作原理与校准方法,提供从选型到故障排查的完整指南。重点介绍电阻式与电容式技术对比、六步校准法实战以及温度补偿技巧,帮助工程师精准测量空间力场。适用于机器人触觉反馈、航空航天测试等高精度场景。

weixin_29309475的博客 388

解决java后端序列化后传前端数据不一致/不匹配,比如Long类型或者LocalDateTime类型

解决java后端序列化后传前端数据不一致/不匹配,比如Long类型或者LocalDateTime类型

m0_59757074的博客 2573

Gamit10.71添加新的天线类型

添加新的天线类型需要涉及到四个文件:antmod.dat,rcvant.dat,guess_rcvant.dat,hi.dat。 注意:格式要一致!!! 举例说明,我要添加一个JCA229的天线(带JCAD天线罩),对应接收机使用的是南方的South Net-S9。

Penny的博客 2711

前端post请求传参到java后端,出现后端参数接收不到的问题

排除请求方法的问题,刚好今天遇见了,一般来说这个都是包的问题。我公司是生产环境的包依赖ready环境,不知道谁在ready把我包给构走了。结果生产出问题了。

qq_43588129的博客 1800

数据获取竟如此简单——全球SRTM 90m DEM V4.1数据

SRTM(Shuttle Radar Topography Mission)是由NASA联合国际合作伙伴开展的雷达地形测绘项目,通过航天飞机搭载的合成孔径雷达系统,于2000年通过发射并接收地表反射的雷达信号,获取全球三维地形数据,这一任务填补了高精度全球地形数据的空白。而本文通过十余行的python代码,就更简单、方便地获取这些数据。

m0_38065162的博客 1399

sap 新增科目表_SAP系统中四大科目表的总结

操作科目表定义-OB13 2国家科目表定义-OB13 3集团科目表定义-OB13 4合并科目表(ECCS)定义-CX10 4分配操作科目表到公司代码-OB62 5分配国家科目表到公司代码-OB62 6分配集团科目表到操作科目表-OB13 6分配集团科目表到合并科目表-CXNF 7Operation 8定义集团科目表的科目-FSP0 8定义国家科目表的科目-FSP0 8定义操作科目表的科目-FSP0...

weixin_39585463的博客 1721

前台通过ajax接收的数据和后台(java)传输的数据不一样

前台通过ajax接收的数据和后台(java)传输的数据不一样 在获取订单号时,前台显示传输的数据为20202340,后台显示的是20202334,后台的数据库里面显示的是20202334,用接口调试工具postman 测试显示的也是20202334。 然后我开始检查前端的ajax,发现没有问题。 在网上搜索发现是因为后台使用了long类型,postman可以解析long类型,前端不能解析 long...

qq_34794885的博客 1619

UE4载具性能调优指南:从参数设置到实战优化

本文详细解析了UE4载具性能调优的关键技巧,从WheeledVehicle类构建到轮子参数、传动系统设置,再到物理属性与操控调校。通过实战案例分享,帮助开发者优化载具的速度、加速度等核心性能,提升游戏体验。特别适合需要精细调校载具物理特性的开发者参考。

weixin_29019241的博客 469

前端传递参数与后端接收的类属性不一致问题解决办法

前端传递参数与后端接收的类属性不一致问题解决办法

huan1213858的博客 3426

mpu6050原理图_STM32控制 MPU6050 六轴陀螺仪资料汇总

一般使用MPU6050的步骤是先驱动I2C总线,然后初始化MPU6050,从MPU6050读取数据,最后是数据的处理。本文档详细介绍有关MPU6050 三维角度传感器电子陀螺仪使用说明。附件内容提供该 MPU6050模块原理图,配套STM32代码,相关数据手册及参考文档。实物连接图:MPU6050 六轴陀螺仪特点:使用芯片:MPU-6050供电电源:3-5v(内部低压差稳压)通信方式:标...

weixin_39911056的博客 4758

基于YOLOv10的微小目标检测,多头检测器提升小目标检测精度

引入多头检测器助力YOLOv10,暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2569

后端接口测试正常,前端Ajax数据传输到后端数据类型不匹配的问题后遇到的一系列问题

标题form表单post到后端数据类型为x-www-form-urlencoded,后端显示not support 我的解决办法: 在前端ajax属性中加 contentType:“application/json;charset=utf-8”, 后端方法中参数的注解为@Responsbody 但紧接而来跨域问题: 我不禁疑问:为什么会出现跨域问题呢? 浏览器同源策略:协议、域名、端口都要一致。不然容易收到xss、CSFR等攻击 (我的在前端测试是8848 ~~疑惑.jpg~~ ,后端接口8080。接

okokhelloworld的博客 1904

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

记录一次前后端传参方式不一致异常

大家好,我是Leo哥🫣🫣🫣,最近在写一个前后端分离案例的demo的时候,一个接口中前端向后端传递的参数方式和后端接收的方式不太一致,出现了问题。具体是啥呢,咱们接着往下聊。好了,话不多说让我们开始吧😎😎😎。以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。本文由博客一文多发平台OpenWrite发布!

分享思想,留下痕迹。 2280

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

springMVC Controller层中请求参数的传递

Controller层中请求参数的传递 普通参数传输的传递 直接在controller方法中以同前端参数名一致的方法形参即可,尽量保证数据类型一致。 @RequestMapping("lg5") public void login5(String uname, int upwd, HttpServletRequest request, HttpServletResponse response)...

weixin_43776241的博客 1483

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

参数传递错误可能

在传递参数时,如果时向后端传递一个参数时,出现数据无法到达后端可,用debug模式查看后端jsonbean数据结构同时后端shiro还可能出现一个401数据结构不同请检查数据结构是否对应,并且对照前端参数是否传参和以相同结构传送 ...

qq_35490522的博客 1540

Spring中前端参数字段和后端参数字段不统一

之前遇到一个问题,就是后端@RequestMapping映射的函数的参数列表中需要更改参数名,从原来的ID改为id,但是这样会导致读不到前端传过来的ID。这时候需要用到method(RequestParam(value="前端传值的字段") &lt;T&gt; 后端要求的字段名),至此解决参数不一致的问题。...

gaoque1184的博客 7150

@Param和@RequestParam

@Param是地处Dao层,是为了传递多个参数,解决的是可读性和直观性;而@RequestParam是位列Controller层,作用是为获取前端参数,解决的是前后端参数不一致的问题。所以它们没有关系! 详解参考:https://blog.youkuaiyun.com/sinat_33010325/article/details/84261662 https://www.cnblogs.com/zeroing...

qq_42671259的博客 2580

ComfyUI-VideoHelperSuite视频路径加载节点尺寸参数传递问题解析

在ComfyUI-VideoHelperSuite项目中,开发者发现了一个关于视频路径加载节点(Load Video Path)的有趣问题。当用户尝试通过管道(piping)方式传入custom_width和custom_height参数时,系统会抛出错误。这个问题涉及到前端JavaScript与后端Python代码之间的参数传递机制。 ## 技术细节分析 ### 当前实现机制 根据项目维护...

gitblog_07185的博客 595

2021年了还不知道前后端数据交互格式?

文章目录一、content-type介绍二、常见的媒体格式类型如下:三、前后端传递数据的格式问题及解决方案四、深究一下1、请求的数据格式的区别2.键值对格式:3.Json格式:4.请求体的区别:Form data 和Request Payload5.后端获取请求参数 一、content-type介绍 Content-Type(内容类型),一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却

筱筱攻程师的博客 2741

查改BUG笔记-02-后端返回的坐标和角度与前端不一致

问题   前端传给后端角度和坐标,后端计算出绘制线的点位置在二维图像上的相对位置。   问题是:实际绘制路径和后端返回的路径有一定的偏差; 排查分析   1.一开始以为是返回给前端的坐标点是错误的,分析后,坐标点是没有问题的;   2.多次跟踪分析后,发现坐标位置是对的,后端返回的坐标形成的线的角度与前端传给后端的角度不一致;   3.说明后端计算没有问题;   4.后端将前端输入的角度打印日志,前端将传入后端的角度打印;   5.前端发送的角度与前端自己持有的角度不一致,后端是根据前端之前一次的角度进行的

黑山老妖的博客 409

post 请求时报:java.lang.IllegalArgumentException: argument type mismatch

原因: 1、传入参数的格式不正确。看传入的是什么类型,对象构造方法中是什么类型?需要一致才可以。 2、传入的json中 没有加入:@RequestBody JSONObject json 3、没有加:produces="application/json; charset=utf-8" 4、前端传入的json格式不正确,如:{xxxMK:56} 。正确是:{"xxxMK":56} (若后端接收是Object则都正确) (需要转换为json格式后传入后端) 5、检查前后端接收格式是否一致。 6、注意i.

刘贵庆的博客 1074

9 前后端数据处理格式的注意事项

前后端数据处理格式注意事项摘要 后端JSON序列化问题:确保变量名与接口文档一致,或使用@JsonProperty指定字段名,避免Jackson默认规则导致字段名错误。可通过@JsonIgnore隐藏敏感字段,配置non_null过滤空值。 前端响应适配问题:若前后端字段名不一致,优先后端对齐,或前端临时映射。注意axios拦截器可能自动解析响应数据,需检查是否覆盖原始字段。 后端请求参数规范:强制使用DTO(非Map)接收参数,明确区分DTO(参数校验)、VO(返回数据)、Entity(数据库映射)。DT

LSL666_的博客 1281

php前后端分离项目跨域问题解决办法

现在项目越来越流行前后端分离,但最近在前后端分离的项目中遇到一个问题,获取session里面存入的用户信息总是为null,这是因为实现了前后端分离后跨域导致了会话不一致,由于之前一直没有做过前后端分离项目,导致走了不少弯路,而且还采用了多种及其不优雅的方法 1.(在第一次请求的时候把服务器返回的session id保存起来(cookie),后续请求的时候把该session id作为参数传递给后端,...

alone 1720

自定义注解判断spring的控制器接收的参数是json还是表单,并且做相应的解析

前言:最近在做前后端分离开发的时候遇到个问题,原因是安卓方面传参习惯是表单,h5方面传参习惯是json,而spring的控制器一个路径只能接收其中一种参数,或者是表单,或者是json(参数前面加@RequestBody注解),但这样做明显是冗余的,包括控制器路径也不能统一,不利于维护,所以为了解决这种问题,后台考虑自定义一个注解,让它先判断目前的参数是什么类型,再做解析,然后请看下文: 1、自定...

WoddenFish的博客 1336

springmvc前端到后端的数据接收和处理和三种数据显示到前端的对象

1.提交的域名称和处理方法的参数名一致 这种好办,比如前端表单的参数名称为name,后端请求的形参也是name,那么就可以接收到,如果两者名字不一样,那么接收不到,就会显示null。 2.提交的域名称和处理方法的参数名不一致 如果不一致,有什么解决办法呢?如果前端提交的是username 那么后端加这个个注解,一是可以解决这个参数名不一致的问题,二十可以告诉别人这儿是要接受前端参数的。 //@RequestParam("username") : username提交的域的名称 . @RequestMappi

柳絮飘扬 996

retrofit 请求后台接口url时参数中用URLEncoder.encode编码方式

有时候我们在和后台约定请求参数的时候会涉及到编码解码的问题,但是retrofit里面默认的编码方式很可能和后台的解码方式不一致,导致前端请求不到数据: try { extendStr = URLEncoder.encode(param,"utf-8"); } catch (UnsupportedEncodingException e) {

meetings的专栏 7776
下一篇: 用map做缓存
activety
博客等级 码龄7年 5粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值