标签: javax.validation

找不到约束“javax.validation.constraints.NotBlank”验证类型“java.lang.String”的验证器

我正在使用 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

8
推荐指数
1
解决办法
3万
查看次数

如何直接使用javax验证简单字符串参数的@NotBlank?

我想使用注释验证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)

java validation jsr spring-boot javax.validation

7
推荐指数
1
解决办法
9629
查看次数

如何在 Spring Boot 中验证类型“java.lang.Boolean”

我有一个布尔字段,我想验证它是否只有“真”或“假”作为值(不带引号)。但是这个字段也允许“真”或“假”作为我想限制的值(带引号)。

我尝试使用 @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)

我该怎么办?有没有其他方法可以克服这个问题?提前致谢。

java validation spring-boot javax.validation

7
推荐指数
3
解决办法
2万
查看次数

如何从 ConstraintViolationException 获取查询参数名称

我有一个服务方法:

 @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:我去过其他声称可以解决问题的类似线程,但实际上没有一个真正做到了。

java hibernate-validator spring-boot javax.validation

6
推荐指数
1
解决办法
6211
查看次数

@Valid (javax.validation.Valid) 对于列表类型不是递归的

控制器:

@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)

这会触发@NotNullParent.name,但不会检查 Child.name。如何让它触发。我List<@Valid Child> children;也试过用@Valid注释注释子类,不起作用。请帮忙。

parent = { "name": null }失败。名称不能为空。

child = { "name": null } 作品。

java spring-mvc hibernate-validator spring-boot javax.validation

6
推荐指数
1
解决办法
4163
查看次数

在休眠验证器中将参数从验证传递到自定义验证器

我正在尝试使用自定义验证器来验证 bean。但是验证器需要从调用验证的方法传递给它的信息。有没有办法做到这一点?

我无法在初始化中传递它,因为它在创建 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)

java bean-validation javax.validation

5
推荐指数
1
解决办法
9449
查看次数

注解@NotEmpty不检查String是否为null

我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 不会检查参数是否为 null。

\n\n

这是我的课程:

\n\n

Person.class

\n\n
public 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 …

java junit javax.validation

5
推荐指数
1
解决办法
1万
查看次数

@Valid 不适用于弹簧休息控制器

我将休息端点方法定义为:

@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)

但验证不起作用。即使值超出规定范围,请求也不会抛出错误并且进展顺利。

rest lombok spring-boot javax.validation

5
推荐指数
2
解决办法
5719
查看次数

如何在 java.validation 约束上国际化 Spring RestController?

如何在约束条件@RestController下国际化 spring 属性javax.validation

我想我可以只添加/src/main/resources/messages.propertiesmessages_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

4
推荐指数
1
解决办法
4878
查看次数

如何在 Spring 中使用 javax.validation.constraints 验证 List 内元素的长度

如何在 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

3
推荐指数
1
解决办法
1万
查看次数