正则表达式验证不会在Spring Boot Controller中触发错误

时间:2019-09-12 08:46:13

标签: java spring rest spring-boot

我希望我的RestController在设置日期输入(必填= false)但正则表达式错误(例如10-2019)时返回错误

library(ggplot2)
library(reshape2)
library(Hmisc)
library(stats)

abbreviateSTR <- function(value, prefix){  # format string more concisely
  lst = c()
  for (item in value) {
    if (is.nan(item) || is.na(item)) { # if item is NaN return empty string
      lst <- c(lst, '')
      next
    }
    item <- round(item, 2) # round to two digits
    if (item == 0) { # if rounding results in 0 clarify
      item = '<.01'
    }
    item <- as.character(item)
    item <- sub("(^[0])+", "", item)    # remove leading 0: 0.05 -> .05
    item <- sub("(^-[0])+", "-", item)  # remove leading -0: -0.05 -> -.05
    lst <- c(lst, paste(prefix, item, sep = ""))
  }
  return(lst)
}

d <- mtcars

cormatrix = rcorr(as.matrix(d), type='spearman')
cordata = melt(cormatrix$r)
cordata$labelr = abbreviateSTR(melt(cormatrix$r)$value, 'r')
cordata$labelP = abbreviateSTR(melt(cormatrix$P)$value, 'P')
cordata$label = paste(cordata$labelr, "\n", 
                      cordata$labelP, sep = "")
cordata$strike = ""
cordata$strike[cormatrix$P > 0.05] = "X"

txtsize <- par('din')[2] / 2
ggplot(cordata, aes(x=Var1, y=Var2, fill=value)) + geom_tile() + 
  theme(axis.text.x = element_text(angle=90, hjust=TRUE)) +
  xlab("") + ylab("") + 
  geom_text(label=cordata$label, size=txtsize) + 
  geom_text(label=cordata$strike, size=txtsize * 4, color="red", alpha=0.4)

但是,验证未进行。我原本期待一个错误,但是没有引发任何错误,后来当我尝试用错误的输入来构建新对象时发生了错误

2 个答案:

答案 0 :(得分:3)

使用@Validated修复验证

当您希望触发验证时,必须使用@Validated来注释控制器类:

@Validated
@RestController
public class MyController {
   ...
}

引用documentation

  

要有资格通过Spring驱动的方法验证,所有目标类都必须使用Spring的@Validated注释进行注释。

请勿使用@Timed

我发现您的控制器方法用@Timed注释的事实很奇怪。这是一个特定于测试的注释,并且无意在实际代码中使用:

  

特定于测试的注释,指示测试方法必须在指定的时间段内完成执行。

您可能还需要查看依赖项,并确保它们使用正确的范围。

考虑用YearMonth代替String

由于您似乎在控制器方法中收到了年和月的值,因此最好使用YearMonth而不是String

  

ISO-8601日历系统中的年月,例如2007-12

您的控制器方法如下:

@GetMapping
public ResponseEntity<Foo> getList(@RequestParam(name = "date", required = false) YearMonth date) {
    ...
}

答案 1 :(得分:1)

您需要在类中添加@Validated注释:

@RestController
@Validated
public class myRestController{

@Timed
  public ResponseEntity<ResponseBodyWrapper<List<ListData>>> getList(
     @RequestParam(name = "date", required = false) @Pattern(regexp = "[0-9]{4}-[0-9]{1,2}") String date) {
    // Logic
  }
}

参考:https://www.baeldung.com/javax-validation-method-constraints 点3。