用户把表单的 required 属性删掉,用 curl 发了个 title 为空字符串的请求,接口返回 200,列表里多出一条没有标题的文章,后台模板渲染时取了 title[0] 直接抛 IndexError。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,required 只是浏览器的提交前提示,请求一旦绕过页面就没有任何约束。服务端把 title 当普通字段接收,没有做非空判断,入库后所有读取这个字段的地方都要自己兜底。这类字段后面往往还会被拼进页面标题,空值会顺着传到列表和详情页。

「服务端必填校验」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

curl -i -X POST http://127.0.0.1:8080/api/articles \
  -H 'Content-Type: application/json' \
  -d @empty_title.json

具体做法是,在 DTO 的 title 上加 @NotBlank 并在控制器参数上补 @Valid;确认全局异常处理把 MethodArgumentNotValidException 映射成 400;前端 required 保留但只当提示 不当作校验;用 curl 直接发一次空 title 确认被拦。

最后用这个标准收尾,同样请求返回 400 且 body 里的 errors 指向 title 列表不再新增空标题记录。

作者 9823189