太久了,回来写项目的时候就遇到以前没遇到的问题,查了一些资料,于是就写下来。(当然如果有更好的解决原因,欢迎评论区指正!!!)
一. 问题
前端通过json格式向后端发送请求
这里我直接赋值方便演示,正常都是动态赋值的。
后端通过 IDpeopleDTO 实体类来接收 (记得加上注解 @RequestBody )
后端IDpeopleDTO 实体类为:
Service层逻辑 首先会通过传来的用户名在数据库查找是否含有该用户?返回数据:抛出异常
然后处理包含对用户名 密码 禁用 的校验 一但有错就会抛出异常
@Override
public IDpeoPle selectIDpeopleByuserAndPassword(IDpeopleDTO iDpeoPle) {
String idName=iDpeoPle.getIdName();
String password=iDpeoPle.getPassword();
IDpeoPle iDpeoPle1= peopleLogMapper.selectIdpeopleByidName(idName);
//校验用户名字
if(iDpeoPle1==null){
throw new LoginException(MessageContast.ACCOUNT_NOT_FOUND);
}
//校验密码
String md5password = DigestUtils.md5DigestAsHex(password.getBytes());
if(!md5password.equals(iDpeoPle1.getPassword())){
throw new LoginException(MessageContast.PASSWORD_ERROR);
}
//校验账号状态
if(iDpeoPle1.getStatus()==MessageContast.Status_NO){
throw new LoginException(MessageContast.ACCOUNT_LOCKED);
}
return iDpeoPle1;
}
数据库的信息为
前端我指定IdName: 'hz', password: '123456', (密码后端通过md5将默认密码123456加密形式保存的 )
然后我们运行按正常逻辑前端会登录正常本且进入主界面 但是:
界面显示
说明我们数据库根本没有这个用户 这个情况 我们一般要么就是断点调试 或者指定位置打印一些我们实体类信息 这里我们都试试
可以看到我们前端传来2个值其中只有password 接收到了 。这里我们前后端属性名都是一样的。我自己也调试前端了,发现前端也却是传入数据了,没有问题,但是就是后端这个IdName没有被映射到。。。。最后查了一些json库
二. 解决
(1) JSON 库
后端实体类的属性名是大写开头的(比如 我这里IdName),而前端发送的 JSON 属性名也是大写开头的(IdName),那么通常情况下,后端应当能够正确映射这个属性,前提是后端使用了正确的 JSON 库并且没有配置成忽略大小写。
然而,一些 JSON 库(比如 Jackson)在默认情况下会将 Java 类的字段名映射为小写开头的驼峰命名法(lowerCamelCase),这里我们后端属性名(IdName)虽然是首字母大写但是通过JSON请求传过来映射其实就已经变成小写了(IdName ->idName)所以导致我们前端(IdName)后端(idName)属性名不匹配,结果也自然映射不上。
一般 Java 的命名规范通常是类名、接口名等类型名称默认使用大驼峰命名法:
变量名、方法名等则默认使用小驼峰命名法:
(2)解决
1.直接使用小驼峰命名在JSON 属性名首字母小写方法
后端调试可以看到已经成功接收到了
2.当然你也可以使用 @JsonProperty 注解来明确指定JSON属性名
这样后端也可以接收到
三.最后
以后还是干脆规范点,直接前后端属性名 .数据库字段名 .小驼峰命名就行了(),也就没有这些问题了。也显得规范点!!!(学艺不精 有大佬这方面更详细的解释,欢迎评论区指正!!!)