V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gbj
V2EX  ›  问与答

Java 小白求助,前端传的值在后端为 null。是我代码哪里搞错了吗 代码有点烂。

  •  
  •   gbj · 2021-04-15 15:12:48 +08:00 · 1085 次点击
    这是一个创建于 1099 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.前端传的值的格式是这样的

    form: {score: [{},{},{}],mk: "XXX",mon: 1234567890}    
    

    2.controller 如下

    @PutMapping("/updateMk")
    public void updateByMk(@RequestBody MkScoreListVo form){
        scoreService.updateByMk(form);
    }
    

    3.MkScoreListVo 里是这样的

    @Data
    public class MkScoreListVo  {
    
    private List<MkScoreVo> score;  
    private String mk;
    private Long mon;
    }
    

    4.MkScoreVo 里是这样的

    @Data
    public class MkScoreVo {
    private Integer INSTITUTION_NUMBER;
    private BigDecimal SCORE01;                 
    private BigDecimal score02;
    private BigDecimal score03;
    private BigDecimal score04;
    
    }
    

    这里大小写混用是之前我测试是不是因为字段不一样导致了问题。

    5.java 在控制台直接打印接收到的 form,mk 和 mon 正常打印,score 里面却是 null

    如下所示 省略了几个 score 。

    MkScoreListVo(score=[MkScoreVo(INSTITUTION_NUMBER=null, SCORE01=null, score02=null, score03=null,               score04=null), mk=XXX, mon=1615789558639)
    
    WhiteDragon96
        1
    WhiteDragon96  
       2021-04-15 15:29:53 +08:00
    为啥要用 PUT
    timethinker
        2
    timethinker  
       2021-04-15 15:30:38 +08:00
    包装类型默认为 null,你这里 Integer 、BigDecimal 因为没有默认值,所以这个结果是符合预期的。
    gbj
        3
    gbj  
    OP
       2021-04-15 15:31:21 +08:00
    @WhiteDragon96 准备 update 的。不能用 put 吗
    gbj
        4
    gbj  
    OP
       2021-04-15 15:33:07 +08:00
    @qwe520liao 可前端这边 score 里是有值的,不知道为什么没传进去

    {"score":[{"SCORE01":1,"SCORE02":1.5,"INSTITUTION_NUMBER":123456}],"mon":1615792717581,"mk":"XXX"}
    WhiteDragon96
        5
    WhiteDragon96  
       2021-04-15 15:33:11 +08:00
    @gbj 你换成 POST 试试,前端也要改,这些听说有坑
    guorui112
        6
    guorui112  
       2021-04-15 15:35:11 +08:00
    put 会不会接收不到参数,不太了解,delete 就只能接收 url 中的参数
    gbj
        7
    gbj  
    OP
       2021-04-15 15:36:35 +08:00
    @WhiteDragon96 改了还是一样的结果
    gbj
        8
    gbj  
    OP
       2021-04-15 15:39:10 +08:00
    @guorui112 改成 post 了,但还是一样
    WhiteDragon96
        9
    WhiteDragon96  
       2021-04-15 15:39:36 +08:00
    @gbj 自己模拟条试下,是不是前端传的时候哪里错了
    comstrojs
        10
    comstrojs  
       2021-04-15 15:42:26 +08:00
    盲猜字段大写 Lombok@Data 生成的 getter setter 方法的原因
    timethinker
        11
    timethinker  
       2021-04-15 15:44:24 +08:00   ❤️ 1
    @gbj OK,有值的情况下又不一样了,这个涉及到属性命名策略( PropertyNamingStrategy )以及你使用的是什么 JSON 库,如果你使用的是 SpringBoot 默认没有配置的话,那么默认用的是 Jackson,命名策略好像是骆峰式。

    你让前端把字段名大小写改一下,或者使用 @JsonProperty 注解你的 VO 字段。
    hafuhafu
        12
    hafuhafu  
       2021-04-15 15:50:00 +08:00   ❤️ 1
    @gbj #4
    你这传的大小写都不一样,MkScoreVo 加 @JsonProperty("前端的 key")
    justicelove
        13
    justicelove  
       2021-04-15 15:50:48 +08:00
    form data 和 request body 是不同的两个东西 是弄混了吗
    guorui112
        14
    guorui112  
       2021-04-15 15:52:53 +08:00
    Java 对请求 x-www-form-urlencoded 和 json 的解析处理不一样,其他语言都做了处理,就 java 没做
    gbj
        15
    gbj  
    OP
       2021-04-15 15:53:38 +08:00
    @qwe520liao 解决了,谢谢大佬,因为之前前端给我的都是没有对象数组的,没用到过 JsonProperty 注解。
    gbj
        16
    gbj  
    OP
       2021-04-15 15:56:13 +08:00
    @hafuhafu
    确实是这个问题,大小写是因为我之前 把实体类中的字段都改成了前端的字段,但是没用。于是就放那了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2578 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:59 · PVG 23:59 · LAX 08:59 · JFK 11:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.