我正在使用 Hibernate 验证器来验证我的 bean。
实际上我对我的 POM 有这种依赖性
<!-- Hibernate validator - Bean validation API Implementation -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.11.Final</version>
</dependency>
<!-- Verify validation annotations usage at compile time -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.0.11.Final</version>
</dependency>
<!-- Unified Expression Language - Spec -->
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.1-b06</version>
</dependency>
<!-- Unified Expression Language - Implementation -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的豆子
import org.hibernate.annotations.ColumnDefault;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Date;
public class Casa …
Run Code Online (Sandbox Code Playgroud) java validation hibernate hibernate-validator javax.validation
我想使用注释验证GET
/POST
请求 spring-boot 控制器类javax.validation-api
。
对于类@Valid
和@NotBlank
该类的属性来说,工作完美。
以下内容按预期工作:
public class Registration {
@NotBlank
private String name;
}
public ResponseEntity registration(@Valid @RequestBody Registration registration) {}
Run Code Online (Sandbox Code Playgroud)
所以现在我只有一个字符串作为参数并想验证它。
这可能吗?
以下内容未按预期工作(不验证任何内容):
public ResponseEntity registration(@Valid @NotBlank String password) {}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个简单的要求,但我在互联网或 Stackoverflow 上找不到任何内容。
为了复制,我创建了一个 MWE(java 10,gradle 项目):
启动项目后,localhost:8080/registration?test=
使用 POST 进行调用,例如使用 Postman。@NotBlank
参数“test”将为空,但将输入方法。
POST 调用按localhost:8080/container
预期失败。
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 …
Run Code Online (Sandbox Code Playgroud) 我有一个布尔字段,我想验证它是否只有“真”或“假”作为值(不带引号)。但是这个字段也允许“真”或“假”作为我想限制的值(带引号)。
我尝试使用 @Pattern 注释来匹配这些值。但我有以下错误:
javax.validation.UnexpectedTypeException:HV000030:找不到约束“javax.validation.constraints.Pattern”验证类型“java.lang.Boolean”的验证器。检查“可重启”的配置
我的代码是:
@Pattern(regexp = "^(true|false)$", message = "restartable field allowed input: true or false")
private Boolean restartable;
Run Code Online (Sandbox Code Playgroud)
我该怎么办?有没有其他方法可以克服这个问题?提前致谢。
我有一个服务方法:
@GetMapping(path = "/api/some/path", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getWhatever(@RequestParam(value = "page-number", defaultValue = "0") @Min(0) Integer pageNumber, ...
Run Code Online (Sandbox Code Playgroud)
如果 API 的调用者没有为page-number
查询参数提交正确的值,javax.ConstraintViolationexception
则会引发该错误。异常消息将如下所示:
getWhatever.pageNumber must be equal or greater than 0
在响应正文中,我希望显示以下消息:
page-number must be equal or greater than 0
我希望我的消息具有查询参数的名称,而不是参数的名称。恕我直言,包括参数的名称都暴露了实现细节。
问题是,我找不到携带查询参数名称的对象。好像ConstraintViolationException
没有这个功能
我正在 spring-boot 中运行我的应用程序。
任何帮助,将不胜感激。
PS:我去过其他声称可以解决问题的类似线程,但实际上没有一个真正做到了。
控制器:
@RequestMapping(...)
public void foo(@Valid Parent p){
}
Run Code Online (Sandbox Code Playgroud)
class Parent {
@NotNull // javax.validation.constraints.NotNull
private String name;
List<Child> children;
}
Run Code Online (Sandbox Code Playgroud)
class Child {
@NotNull
private String name;
}
Run Code Online (Sandbox Code Playgroud)
这会触发@NotNull
Parent.name,但不会检查 Child.name。如何让它触发。我List<@Valid Child> children;
也试过用@Valid
注释注释子类,不起作用。请帮忙。
parent = { "name": null }
失败。名称不能为空。
child = { "name": null }
作品。
java spring-mvc hibernate-validator spring-boot javax.validation
我正在尝试使用自定义验证器来验证 bean。但是验证器需要从调用验证的方法传递给它的信息。有没有办法做到这一点?
我无法在初始化中传递它,因为它在创建 bean 时不可用。
class vehicle {
@VehicleNameValidator
String vehicleName;
}
Run Code Online (Sandbox Code Playgroud)
@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = VehicleNameValidatorImpl.class)
@Documented
public @interface VehicleNameValidator {
String message() default "Invalid vehicle Name";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
Run Code Online (Sandbox Code Playgroud)
public class VehicleNameValidatorImpl implements ConstraintValidator<VehicleNameValidator, String[]> {
@Override
public boolean isValid(String vehicleName, ConstraintValidatorContext constraintValidatorContext) {
boolean isValid = logicmethod()//some logic here
return isValid;
}
}
Run Code Online (Sandbox Code Playgroud)
public static void main(String[] args) {
String whatIwantToPass = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 不会检查参数是否为 null。
\n\n这是我的课程:
\n\nPerson.class
\n\npublic class Person {\n\n @NotEmpty(message = "mandatoryParametersMissing")\n private String name;\n\n @NotNull(message = "mandatoryParametersMissing")\n @Valid\n private Job job;\n\n public String getName() {\n return name;\n }\n\n public void setName(String name) {\n this.name = name;\n }\n\n public Job getJob() {\n return job;\n }\n\n public void setJob(Job job) {\n this.job = job;\n }\n\n @Override\n public String toString() {\n return "Person [name=" + name + ", job=" + job + "]";\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n … 我将休息端点方法定义为:
@GetMapping("/get")
public ResponseEntity getObject(@Valid MyObject myObject){....}
Run Code Online (Sandbox Code Playgroud)
这会将请求参数映射到 MyObject。
MyObject 定义为(带有 lombok、javax.validation 注释):
@Value
@AllArgsConstructor
public class MyObject {
@Min(-180) @Max(180)
private double x;
@Min(-90) @Max(90)
private double y;
}
Run Code Online (Sandbox Code Playgroud)
但验证不起作用。即使值超出规定范围,请求也不会抛出错误并且进展顺利。
如何在约束条件@RestController
下国际化 spring 属性javax.validation
?
我想我可以只添加/src/main/resources/messages.properties
和messages_de.properties
,然后spring
检测它们并启用正确的 i18n ?但事实似乎并非如此:
@RestController
public void TestController {
@PostMapping
public void post(@Valid @RequestBody Person p) {
}
}
public class Person {
private String firstname;
@javax.validation.constraints.NotBlank(message = "{errors.person.lastname}")
private String lastname;
}
messages.properties:
errors.person.lastname=person should provide a lastname
messages_de.properties:
errors.person.lastname=Person ohne Nachnamen
Run Code Online (Sandbox Code Playgroud)
问题:如果我现在发送请求POST
:
{
"exception": "org.springframework.web.bind.MethodArgumentNotValidException",
"message": "'lastname': {errors.person.lastname}"
}
Run Code Online (Sandbox Code Playgroud)
问题 1:我真的必须告诉 spring 显式应用 i18n 吗?或者我可以以某种方式依赖自动检测功能吗?
下一步是添加以下配置。现在默认消息已正确解决。但是每当我想要验证 i18n 时是否真的有必要添加这个?
@Configuration
public class MessageSourceConfig { …
Run Code Online (Sandbox Code Playgroud) java spring internationalization spring-web javax.validation
如何在 Spring 中使用 javax.validation.constraints 验证 List 内元素的长度。现在 @Size 正在验证列表大小,而不是内部元素。
class RequestInputParamaters {
@NotNull
@NotEmpty
@Size(min = 1, max=4)
List documentIdentifier_value
}
Run Code Online (Sandbox Code Playgroud) spring spring-mvc bean-validation spring-boot javax.validation
javax.validation ×10
java ×8
spring-boot ×6
validation ×3
spring ×2
spring-mvc ×2
hibernate ×1
jsr ×1
junit ×1
lombok ×1
rest ×1
spring-web ×1