spring 是否有只接受数字的Javabean验证?

x33g5p2x  于 2022-12-26  发布在  Spring
关注(0)|答案(3)|浏览(137)

这是用于接受请求主体的Java类。

public class ItemForReorderRequest {
    private String itemNo;
    @DecimalMax(value = "100", message = "Reorder quantity must be less than or equal to 100")
    private Double quantity;
}

这是请求正文。

{
        "itemNo": "000006510",
        "quantity": 100.0
}

我需要验证quantity是否只接受数字输入。每当我向quantity输入一个字符串时,它都会显示“发生了一个意外的应用程序错误”,并显示多个错误,包括“className”:“com.快速XML.Jackson.核心.JsonParser”.

xa9qqrwz

xa9qqrwz1#

您可以使用@Digits-以下是教程

@Digits(integer = 3, fraction = 2, message = "Quantity must be a valid number with a maximum of 3 integral digits and 2 fractional digits")
private Double quantity;

但是@Digits只对数值有效!
需要考虑的另一点是,如果要将1.0视为Double,将1视为Integer,则需要使用String类型的输入变量。
Java将始终以与Double y = 1.0相同的方式处理Double x = 1(意味着1是有效的Double),因此您将无法用代码区分它们。
或者,您可以使用好的老正则表达式!
@Pattern(regexp = "^[0-9]+(\\.[0-9]+)?$", message = "Quantity must be a numeric value")
此regEx将匹配任何由一个或多个数字组成的字符串,后面可以跟一个小数点和一个或多个数字。它将拒绝任何非数字字符。

alen0pnh

alen0pnh2#

您可以使用Apache Commons的NumberUtils(https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/math/NumberUtils.html)验证输入
NumberUtils提供了一系列有用的方法来检查String是否是有效的Java数字、可解析值、unicode数字等等。
这种方法提供了一个名为**NumberUtils.isCreatable(String)**的静态方法,它检查String是否是有效的Java数字。
上述方法接受:

  • 以0x或0X开头的十六进制数
  • 以前导0开头的八进制数
  • 科学记数法(例如1.05e-10)
  • 用类型限定符标记的数字(例如1 L或2.2d)
    Null和空/空白输入不被视为数字,因此该方法将返回false。
    **NumberUtils.isParsable(String)**方法检查给定的字符串是否可解析。

可解析的数字是那些被任何解析方法成功解析的数字,例如Integer.parseInt(String)、Long.parseLong(String)、Float.parseFloat(String)或Double.parseDouble(String)。
与NumberUtils.isCreatable()不同,这个方法不接受十六进制数字、科学符号或以任何类型的限定符结尾的字符串,如'f'、'F'、'd'、'D'、'l'或'L'
方法**StringUtils.isNumeric(CharSequence)**检查Unicode数字,表示:
任何语言的Unicode数字都是可接受的。由于小数点不被视为Unicode数字,因此它是无效的前导符号(无论是正数还是负数)也是不可接受的

**StringUtils.isNumericSpace(CharSequence)**严格检查Unicode数字和/或空格。这与StringUtils.isNumeric()相同,只是它也接受空格,而且不仅接受前导和/或尾随空格,还接受数字之间的空格。

你也可以使用正则表达式(虽然大多数人不会推荐它,除非真的需要)。
使用正则表达式**-?\d+(.\d+)?**匹配由正整数或负整数和浮点数组成的数字字符串。
RegEx细分:

    • ?-标识给定数字是否为负数,破折号“-”按字面搜索破折号,问号“?”使其可选。
  • \d+ -搜索一个或多个数字。
  • (.\d+)?-标识浮点数。它查找后跟句点的一个或多个数字。最后的问号表示此组是可选的。

方法示例:

private Pattern pattern = Pattern.compile("-?\\d+(\\.\\d+)?");

public boolean isNumeric(String input) {
    if (input == null) {
        return false; 
    }
    return pattern.matcher(input).matches();
}
smdncfj3

smdncfj33#

通常,除非对值执行数学运算,否则我会将所有值(包括数字)作为String存储在JSON对象中。
我将如下定义类(getter和setter是lombok注解):

@Getter
@Setter
public class ItemForReorderRequest {
    private String itemNumber;
    private String quantity;
}

ItemForReorderRequest blam; // used below.

注意:“No”是数字的可怕缩写。如果你必须缩写,考虑“Num”。
我将在收到JSON之后执行验证。
我喜欢Apache实用程序类,所以我可能会使用NumberUtils.isParsable(blam.getQuantity())

相关问题