带有 Swagger 的欧洲本地的 @NumberFormat 表单验证

Posted

技术标签:

【中文标题】带有 Swagger 的欧洲本地的 @NumberFormat 表单验证【英文标题】:@NumberFormat form validation for European local w/ Swagger 【发布时间】:2019-08-20 15:15:35 【问题描述】:

我有一个表单,它是 Spring-Boot REST 端点的 POJO。

看起来像这样:

@NumberFormat(style = NumberFormat.Style.DEFAULT, pattern = "##.###.###,##")
private Double floor_space;

当我在 swagger 中启动应用服务器并输入数字时:55,57 swagger 说这不是一个数字。我也试过了

style = NumberFormat.Style.CURRENCY 

但这也不起作用。

【问题讨论】:

【参考方案1】:

首先,style属性在指定pattern时是没有作用的,所以不能同时使用:

每个属性都是互斥的,所以每个属性只能设置一个 注释实例(格式化最方便的一个实例) 需要)。 指定pattern()属性时,优先 在 style() 属性上。当没有注释属性时 指定时,应用的默认格式是基于样式的任一数字 货币,取决于带注释的字段或方法参数 输入。

Source

接下来,根据我对文档的理解,该模式似乎是java.text.DecimalFormat 指定的模式。 DecimalFormat 模式始终将. 识别为小数分隔符,将, 识别为分组分隔符,这会使您的模式无效:

.   Decimal separator or monetary decimal separator
,   Grouping separator

解析时字符串中哪个字符是小数点分隔符的决定是在运行时由给定的Locale 完成的。

显然无法调整 @NumberFormat 注释的语言环境,因此您有两个选择:

调整您的系统/VM 区域设置。我强烈建议不要这样做,因为这会影响您的所有代码,并且可能会在代码默认为默认语言环境的任何地方产生奇怪的行为。 或者根本不使用@NumberFormat 注释,如本答案所述:Use Different Locale for @NumberFormat in Spring

【讨论】:

我已经单独和一起尝试过它们。你所说的与 spring 的 java 文档不匹配。[它说] (docs.spring.io/spring-framework/docs/current/javadoc-api/org/…): PERCENT public static final NumberFormat.Style PERCENT 当前语言环境的百分比格式。数字格式的存在是有原因的,它确实关注语言环境。一个人只需要正确使用它。我不知道正确的方法。你把它和十进制格式混淆了。 如果您查看 Spring 源代码,您会看到 1.it always chooses NumberStyleFormatter and ignores the style property, if a pattern is specified 和 2.NumberStyleFormatter uses DecimalFormat to do the actuall formatting 遗憾的是,这仍然没有解决我的招摇问题。而且它也不让我的 FE 家伙以 55,75 种格式连接到我的 REST 端点。

以上是关于带有 Swagger 的欧洲本地的 @NumberFormat 表单验证的主要内容,如果未能解决你的问题,请参考以下文章

使用带有欧洲数字系统的 .dll,但我的系统使用美国数字系统

怎么在本地安装swagger editor

如何将 swagger 导入带有环境的邮递员?

Swagger Editor 本地搭建

fastapi swagger 不发送带有 url 的令牌

如何在 Swagger-UI 中打开本地文件