个人向错误锦囊

90 阅读3分钟

错误锦囊-复盘Java后端开发过程的常见的错误

日常开发过程中,大大小小会遇到许许多多的错误。

  • 对于Java,最基础当然是NullException错误。当引入比较庞大的后端框架,错误也变得难以寻找。

  • 对于前后端交互,有些细节就比较隐晦。如简单的64位Long类型,Java是支持的,Json也是支持的,但是前端Js对这些数据接受会丢失3位精度(将最后3位变为0)

这个错误是Postman接口测试工具调试不出来的。

Error creating bean with name 'xx'

image.png

@Value一定要提供缺省值,不然找不到配置就会报以上错误:

image.png

fastjson错误-日期只传"yyyy-MM"缺少dd的错误

下面演示一个正确的方法与一个错误的方法。

    @Data
    public static class AreaShopPlanDto {
        private Date planTime;
        private String planContent;

    }

    @Test
    public void tSuc() {
        String json = "{\n" +
                "  \"planTime\": \"2025-01-01\",\n" +
                "  \"planContent\": \"planContent_887e38f96bf4\"\n" +
                "}";
        AreaShopPlanDto areaShopPlanDto = JSONObject.parseObject(json, AreaShopPlanDto.class);
        System.out.println(areaShopPlanDto);
    }

    @Test
    public void tError() {
        String json = "{\n" +
                "  \"planTime\": \"2025-01\",\n" +
                "  \"planContent\": \"planContent_887e38f96bf4\"\n" +
                "}";
        AreaShopPlanDto areaShopPlanDto = JSONObject.parseObject(json, AreaShopPlanDto.class);
        System.out.println(areaShopPlanDto);
    }

错误方法报错:

image.png

这个错误说实话不好处理o(╥﹏╥)o,想出的方案有:

  • 1.写个解析器。解析器考虑的事情就多了。

从"解析器String转Date" 这一层面来解决。

  • 2.修改所有用到这个传参类的所有地方,以String接受,然后手动转换成Date。

还可以AOP层面解决这个问题,给字段加上@自定义注解,然后在Spring AOP获取到请求参数加上注解的这个日期String,拼接上"日”

  • 最后协商的方案是:前端多传个“日”,哪怕这个“日”是实际业务用不到的。([doge] 这样设计莫名也合理起来,因为不管MySQL数据库类型还是Java日期类型都不会单独存储"年月"的!主要是我偷懒了嘿嘿嘿~)

业务逻辑错误

SQL Update修改只发生更新的字段

阿里规范明确的,数据库更新应该只更新引起发送修改的字段。MyBatis 3 使用的updateById 就是会根据实体类不为null的参数进行对应字段的修改。

实际上,会遇到的问题会有:

  • 为了方便,前端可能会传一整个对象过来,而不是只发生修改的字段。

这样后端一一比对参数,把参数一模一样的值置空?赶紧不是很有必要!

  • Null值问题,如果我希望将原来不为null的字段改为null,想一下,这时候是不是就修改不成功,保留原始值了?

方案是用一个默认值代替null,如int类型默认值为0,表示null。

PS:Null值修改问题确确实实是我开发过程中出现的比较隐晦的逻辑错误,前端同事刚开始跟我反应这个问题我都完全没有反应过来。

最后的说明

这个错误之后也会一直更新下去~

如果评论区的兄弟姐妹们有什么看法或者思考欢迎补充~

如果对你有帮助,点个赞谢谢~