Javax 验证不适用于启动休息控制器参数
Javax validation not working on boot rest controller parameter
我在 Spring 引导应用程序中有一个 Pojo(如果有任何区别,则用 Lombok 注释)和一个 RestController。 pojo 方法参数用 @Valid
注释但没有应用验证,即使我添加 BindingResult 第二个参数,它也永远不会有任何错误。我正在使用 Swagger UI 进行测试,发布一个 JSON,但我不明白为什么这会有任何不同......我错过了一些明显的东西吗?
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Tolerate;
import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.NotBlank;
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
public class MyPojo extends GenericDocument {
@NotBlank
private String name;
@Tolerate
public MyPojo() {
}
}
import javax.validation.Valid;
@RestController
@RequestMapping(value = "/myUrl", produces = APPLICATION_JSON_VALUE)
public class MyController {
@PostMapping
public ResponseEntity<MyPojo> createNew(@RequestBody @Valid MyPojo pojo){...
}
}
解决方案
添加此依赖项就足够了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
奇怪的是,添加 javax.validation:validation-api
和 org.hibernate:hibernate-validator
还不够,尽管 documentation
您应该尝试将 Spring 的 @Validated
注释添加到 class 级别的控制器,以告诉 Spring 评估方法参数上的约束注释。
示例:
@Slf4j
@Validated
@RestController
@RequestMapping(value = "/myUrl", produces = APPLICATION_JSON_VALUE)
public class MyController {
@PostMapping
public ResponseEntity<MyPojo> createNew(@RequestBody @Valid MyPojo pojo){...
}
}
此 org.springframework.validation.annotation.Validated
注释可应用于 class 级别和方法或参数级别。
根据您的类路径中的 documentation, which is not entirely clear, you need to have a JSR-303 validation provider such as Hibernate Validator (docs here),以便 Spring 可以检测并使用它。
在某些情况下,您似乎还需要 Spring 引导启动程序验证 dependency (spring-boot-starter-validation) on your classpath as well. I would suggest trying that to see if it helps. (Strangely, though, I don't see that detailed in the Spring docs - just briefly mentioned here。)
或者您可以根据 here 实现 Validator 接口,但不确定。
我在 Spring 引导应用程序中有一个 Pojo(如果有任何区别,则用 Lombok 注释)和一个 RestController。 pojo 方法参数用 @Valid
注释但没有应用验证,即使我添加 BindingResult 第二个参数,它也永远不会有任何错误。我正在使用 Swagger UI 进行测试,发布一个 JSON,但我不明白为什么这会有任何不同......我错过了一些明显的东西吗?
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Tolerate;
import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.NotBlank;
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
public class MyPojo extends GenericDocument {
@NotBlank
private String name;
@Tolerate
public MyPojo() {
}
}
import javax.validation.Valid;
@RestController
@RequestMapping(value = "/myUrl", produces = APPLICATION_JSON_VALUE)
public class MyController {
@PostMapping
public ResponseEntity<MyPojo> createNew(@RequestBody @Valid MyPojo pojo){...
}
}
解决方案 添加此依赖项就足够了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
奇怪的是,添加 javax.validation:validation-api
和 org.hibernate:hibernate-validator
还不够,尽管 documentation
您应该尝试将 Spring 的 @Validated
注释添加到 class 级别的控制器,以告诉 Spring 评估方法参数上的约束注释。
示例:
@Slf4j
@Validated
@RestController
@RequestMapping(value = "/myUrl", produces = APPLICATION_JSON_VALUE)
public class MyController {
@PostMapping
public ResponseEntity<MyPojo> createNew(@RequestBody @Valid MyPojo pojo){...
}
}
此 org.springframework.validation.annotation.Validated
注释可应用于 class 级别和方法或参数级别。
根据您的类路径中的 documentation, which is not entirely clear, you need to have a JSR-303 validation provider such as Hibernate Validator (docs here),以便 Spring 可以检测并使用它。
在某些情况下,您似乎还需要 Spring 引导启动程序验证 dependency (spring-boot-starter-validation) on your classpath as well. I would suggest trying that to see if it helps. (Strangely, though, I don't see that detailed in the Spring docs - just briefly mentioned here。)
或者您可以根据 here 实现 Validator 接口,但不确定。