海外站点切到英文,提交空邮箱返回的还是邮箱不能为空,响应头 Content-Language 是 zh-CN,前端英文界面里夹了一行中文。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

curl -s -H 'Accept-Language: en-US' \
  -X POST http://127.0.0.1:8080/api/users -d @empty_email.json
ls src/main/resources/messages_*.properties

校验消息写死在注解的 message 里,没有走 MessageSource。LocaleResolver 配了但异常处理直接取了默认消息。资源文件里也没有对应的英文键。这一点先确认清楚,后面就不用反复试。

「校验消息国际化」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,注解 message 改成占位符 {user.email.notblank};在 messages_en.properties 和 messages_zh.properties 里各补一条;确认 Validator 的 MessageInterpolator 用的是 Spring 的 MessageSource;带 Accept-Language en 请求一次看返回语言。

改完照着核一遍,同样的空邮箱返回 Email must not be blank 响应头 Content-Language 变成 en-US。

作者 9823189