如何直接用javax验证简单字符串参数@NotBlank?
我想验证如何直接用javax验证简单字符串参数@NotBlank?,java,validation,spring-boot,jsr,javax.validation,Java,Validation,Spring Boot,Jsr,Javax.validation,我想验证GET/POST对带有javax.validation api注释的spring引导控制器类的请求 对于类,@Valid和@NotBlank对于该类的属性工作得非常好 以下工作如预期: public class Registration { @NotBlank private String name; } public ResponseEntity registration(@Valid @RequestBody Registration registration) {
GET
/POST
对带有javax.validation api
注释的spring引导控制器类的请求
对于类,@Valid
和@NotBlank
对于该类的属性工作得非常好
以下工作如预期:
public class Registration {
@NotBlank
private String name;
}
public ResponseEntity registration(@Valid @RequestBody Registration registration) {}
所以现在我只有一个字符串作为参数,并希望验证它
这可能吗
以下内容未按预期工作(未验证任何内容):
这似乎是一个简单的要求,但我在互联网或Stackoverflow上找不到任何东西
为了复制,我创建了一个MWE(Java10,gradle项目): 启动项目后,使用POST调用
localhost:8080/registration?test=
,例如使用Postman。参数“test”将为空,但将输入方法,尽管@NotBlank
对localhost:8080/container
的POST调用按预期失败
MweController.java
import javax.validation.constraints.*;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
@RestController
public class MweController {
@CrossOrigin(origins = "http://localhost:3000")
@PostMapping(value = "/registration")
public ResponseEntity registration(@NotNull @NotBlank @NotEmpty String test) {
System.out.println("Parameter: " + test);
// This should return Bad Request but doesn't!
return new ResponseEntity(HttpStatus.OK);
}
@CrossOrigin(origins = "http://localhost:3000")
@PostMapping(value = "/container")
public ResponseEntity container(@Valid Container test) {
System.out.println("Parameter: " + test);
// This returns Bad Request as expected
return new ResponseEntity(HttpStatus.OK);
}
class Container {
public Container(String test){
this.test = test;
}
@NotBlank
private String test;
}
}
MweApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MweApplication {
public static void main(String[] args) {
SpringApplication.run(MweApplication.class, args);
}
}
格雷德尔先生
buildscript {
ext {
springBootVersion = '2.1.0.M2'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.mwe'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 10
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-webflux')
}
您是否用
@已验证的注释了您的类
例如:
@Validated
public class Controller {
public ResponseEntity registration(@Valid @NotBlank String password) {}
}
如果您可以编写您试图在EJB环境或Spring中使用代码的代码,可能会有所帮助,解决方案可能会有所不同。计划中的应用程序服务器的类型也应该知道。我更新了问题和标签。更好?是的,更好:)你看到链接了吗?“其次,我们必须提供一个MethodValidationPostProcessor bean”在内置对象上使用@Valid
感觉很奇怪-我认为它什么都不做,因为它只会触发内部验证(内部没有验证注释)。另外,其他验证器也可以工作吗,比如@NotNull
?类路径上的@NotBlank
(如果是这样的话,日志中应该有一些异常)可能缺少实现。@m4gic不,我以前没有看到过。“单参数约束”听起来正是我想要的。从他们的例子来看,我只需要在参数前面加一个简单的NotNull,但它不起作用。我刚测试过。所以现在我不确定这是否是一个与我的设置相关的bug。我没有,但我用@Validated测试了它,这并没有改变任何事情。它应该这样工作吗?我有一个你可以参考的工作示例,这里-@Valid
在他的自定义对象上工作(显然),所以不应该这样it@Arpit我不知道为什么@Validated
在我的第一次测试中不起作用。我刚刚创建了一个MWE并再次测试了@验证的,这次它成功了。然后用我的应用程序再次尝试,它也起了作用。所以这毕竟是解决办法。我还发现,@Valid
对于单参数约束不是必需的。
@Validated
public class Controller {
public ResponseEntity registration(@Valid @NotBlank String password) {}
}