如何直接用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) {}
}