SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决

找这个bug 找了3小时 o(╥﹏╥)o

第一种

SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决_第1张图片

前端debug console data 发现值获取正确

到后端发现 接受值有null 值 明明传过来了。。。。。。。。

SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决_第2张图片

1. 前端值正确

SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决_第3张图片

2. 后端 有null值

仔细查看数据库发现 有下划线

修改实体类 驼峰命名的实体类属性 

SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决_第4张图片

 再次发送

<%--
  Created by IntelliJ IDEA.
  User: 10202
  Date: 2022/4/27
  Time: 14:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>




    
    

    

    登录:界面
    



健身房登录系统

<%--
验证码
--%>
点击更换

忘记密码? 点击这里

没有账户? 注册

<%-- --%>

发现ajax 向后台传递json数据  驼峰大小写会失效 导致 后面

接不到数据 或者只接受到一半 实体类手动改成下划线 就解决了

目前只发现json会这样 单纯的requestMapping 不影响

第二种

实体类赋值一般采用set方法注入 会调用实体类set方法

由于lombook 会自动生成get set方法

但是如果实体类 属性名 命名不规范 根据底层源码 会自动截取substring(2) 后面会自动转大写

    public static long fnv1a_64_lower(String key) {
        long hashCode = -3750763034362895579L;

        for(int i = 0; i < key.length(); ++i) {
            char ch = key.charAt(i);
            if (ch != '_' && ch != '-') {
                if (ch >= 'A' && ch <= 'Z') {
                    ch = (char)(ch + 32);
                }

                hashCode ^= (long)ch;
                hashCode *= 1099511628211L;
            }
        }

        return hashCode;
    }

 由于lombook 会自动生成 set方法  会不正常。。。。。

SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决_第5张图片

 需要自己手动生成 set方法

SSM的前端使用ajax json向后端传值 接收不到或者值缺少问题3种方式 解决_第6张图片

 第三种

直接在实体类上加上

@JsonProperty(value = "xxx")注解

spring默认使用的是jackson处理json的序列化和反序列化,@JsonProperty是Jackson的注解,常用于属性上。

@JsonProperty(value = “dpt_id”, required = true)
private String scheduleId;
@JsonProperty(value = “triggers”, required = true)
private List triggers;

value属性:代表该属性序列化和反序列化的时候的key值。
required属性:默认false,例如当required=false的时候,当反序列化的时候没有找到key值,就会报错。

例如:
@JsonProperty(value = “dpt_id”, required = false)
private String scheduleId;

可以使用Map传输数据,Map的key=dpt_id,对应的value值就是scheduleld的值,而不用使用对象传递数据,用属性的getXXX方法获取。

作用是类似起别名  

 @JsonProperty底层源码如下

package com.fasterxml.jackson.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonProperty {
    String USE_DEFAULT_NAME = "";
    int INDEX_UNKNOWN = -1;

    String value() default "";

    boolean required() default false;

    int index() default -1;

    String defaultValue() default "";

    JsonProperty.Access access() default JsonProperty.Access.AUTO;

    public static enum Access {
        AUTO,
        READ_ONLY,
        WRITE_ONLY,
        READ_WRITE;

        private Access() {
        }
    }
}

你可能感兴趣的:(Java,java,SSM)