繁体   English   中英

javax.validation 来验证值列表?

[英]javax.validation to validate list of values?

有没有一种方法可以使用 javax.validation 来验证一个名为 color 的字符串类型的变量,该变量需要使用注释仅具有这些值(红色,蓝色,绿色,粉红色)?

我见过@size(min=1, max=25)@notnull但有没有像这样的@In(red, blue, green, pink)

或多或少类似于mysql中使用的In-keyword

在那种情况下,我认为使用 @Pattern 注释会更简单,如下面的代码片段。 如果您想要不区分大小写的评估,只需添加适当的标志:

@Pattern(regexp = "red|blue|green|pink", flags = Pattern.Flag.CASE_INSENSITIVE)

您可以创建自定义验证注释。 我会写在这里(未经测试的代码:):

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = InConstraintValidator.class)
public @interface In
{
    String message() default "YOURPACKAGE.In.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default {};

    Object[] values(); // TODO not sure if this is possible, might be restricted to String[]
}

public class InConstraintValidator implements ConstraintValidator<In, String>
{

    private Object[] values;

    public final void initialize(final In annotation)
    {
        values = annotation.values();
    }

    public final boolean isValid(final String value, final ConstraintValidatorContext context)
    {
        if (value == null)
        {
            return true;
        }
        return ...; // check if value is in this.values
    }

}

你可以创建一个枚举

public enum Colors {
    RED, PINK, YELLOW
}

然后在您的模型中,您可以像这样验证它:

public class Model {
    @Enumerated(EnumType.STRING)
    private Colors color;
}

如果您在 RestController 中添加了@Valid,这将根据枚举验证您的有效负载。

您可以自己创建验证类。 供参考https://www.javatpoint.com/spring-mvc-custom-validation

如何验证列表<object>这样所有数据成员都存在于使用 javax.validation 的请求中?<div id="text_translate"><p> 我正在学习 Spring 引导 bean 验证,并希望在父实体中存在的 List 中实现自定义验证,以便发送更精确的错误作为响应。 请提出解决方案。在此先感谢。<br></p><p> 我有一个申请人 Pojo class 如下</p><pre>@Builder @Data @NoArgsConstructor @AllArgsConstructor public class Applicant{ @NotEmpty (message="name is mandatory") private String name; @NotEmpty (message="addresses is mandatory") @Valid private List&lt;Address&gt; addresses; }</pre><p> 地址 Class 如下。</p><pre> @Builder @Data @NoArgsConstructor @AllArgsConstructor public class Address{ @NotEmpty (message="Line1 is mandatory") private String line1; @NotEmpty (message="Line2 is mandatory") private String line2; @NotEmpty (message="pinCode is mandatory") private String pinCode; }</pre><p> class 申请人的示例请求正文如下</p><pre>{ "name":"hello", "addresses":[{ "line1":"Line1", "pinCode":"pinCode" }, { "line2":"Line2", "pinCode":"pinCode" }] }</pre><p> Output 使用默认验证如下。</p><pre> { "timestamp": "2020-08-15T09:29:30.807+0000", "status": 400, "errors": [ "Line2 is mandatory", "Line1 is mandatory" ] }</pre><p> 我想实现自定义验证,例如 output 将如下所示。</p><pre> { "timestamp": "2020-08-15T09:29:30.807+0000", "status": 400, "errors": [ "Line2 is mandatory in record 1 of addresses", "Line1 is mandatory in record 1 of addresses" ] }</pre><p> “Line2 is required in record 1 of addresses”表示地址 Json 数组中的记录 1 是强制性的,并且请求正文中不存在标记。</p></div></object>

[英]How to validate List<Object> such that all the data member is present in the request using javax.validation?

javax.validation 2.0.1 列表<object>不能在 spring 引导中工作<div id="text_translate"><p>我是新的 spring 引导开发。 我正在尝试通过从@RequestBody 传递列表来验证发布请求。 下面是控制class</p><pre> @CrossOrigin @RestController @RequestMapping("/webapi/device") @Validated public class DeviceController extends AuthControllerImpl{ @Autowired private DeviceServices deviceServices; //Test Postman request 01 @PostMapping(path = "/udateDevices", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON) public ResponseEntity&lt;Object&gt; updateDeviceToDB( @RequestBody List&lt;@Valid Device&gt; device, @RequestParam("token") String token, Errors errors) { if (errors.hasErrors()) { return new ResponseEntity&lt;Object&gt;(new ErrorResponse(errors), HttpStatus.BAD_REQUEST); } if(isValidToken(token).= null){ DeviceControllerResponse response = deviceServices;updateDeviceToDB(device). if (,response.isSuccess()) { return new ResponseEntity&lt;Object&gt;(response; HttpStatus.BAD_REQUEST); } return ResponseEntity.ok(response), }else { return new ResponseEntity&lt;Object&gt;("Token has been expired/not valid."; HttpStatus.UNAUTHORIZED); } } }</pre><p> 下面是我的实体 class。</p><pre> import javax.validation.constraints.NotEmpty; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "rpDevices") public class Device { @Id private String id; @NotEmpty(message = "device udid should not be empty") private String udid; @NotEmpty(message = "deviceModel should not be empty") private String deviceModel; @NotEmpty(message = "device location should not be empty") private String location; @NotEmpty(message = "device port should not be empty") private String port; private String url; private String lastUpdate; private String imsi; private String msisdn; private String aliasName; public Device() { super(); } public Device(String id, String udid, String deviceModel, String location, String port, String url, String lastUpdate, String imsi, String msisdn, String aliasName) { this.id = id; this.udid = udid; this.deviceModel = deviceModel; this.location = location; this.port = port; this.url = url; this.lastUpdate = lastUpdate; this.imsi = imsi; this.msisdn = msisdn; this.aliasName = aliasName; } //Getter and setters }</pre><p> 它从不验证实体并给出以下错误。</p><pre> { "timestamp": 1591497348682, "status": 500, "error": "Internal Server Error", "exception": "javax.validation.UnexpectedTypeException", "message": "HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.String'. Check configuration for 'updateDeviceToDB.device[0].port'", "path": "/xxxx/webapi/device/udateDevices" }</pre><p> 有人可以帮助如何直接从请求日验证列表。 <a href="https://www.baeldung.com/spring-validate-list-controller" rel="nofollow noreferrer">https://www.baeldung.com/spring-validate-list-controller</a>我试过这个但没有帮助。</p><p> 这是 pom 依赖项</p><pre> &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;1.5.21.RELEASE&lt;/version&gt; &lt;scope&gt;import&lt;/scope&gt; &lt;type&gt;pom&lt;/type&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;/dependencyManagement&gt; &lt;dependencies&gt; &lt;.-- Adding spring boot cap --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework,restdocs&lt;/groupId&gt; &lt;artifactId&gt;spring-restdocs-mockmvc&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;.-- Adding spring boot security.ldap --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-security&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ldap&lt;/groupId&gt; &lt;artifactId&gt;spring-ldap-core&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org:springframework.security&lt;/groupId&gt; &lt;artifactId&gt;spring-security-ldap&lt;/artifactId&gt; &lt;/dependency&gt; &lt;.-- https.//mvnrepository.com/artifact/io.jsonwebtoken/jjwt --&gt; &lt;dependency&gt; &lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt; &lt;artifactId&gt;jjwt&lt;/artifactId&gt; &lt;version&gt;0.9.1&lt;/version&gt; &lt;/dependency&gt; &lt;.-- starter-data-mongodb MongoRepository --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt; &lt;/dependency&gt; &lt;.-- javax.mail --&gt; &lt;dependency&gt; &lt;groupId&gt;com:sun.mail&lt;/groupId&gt; &lt;artifactId&gt;javax.mail&lt;/artifactId&gt; &lt;version&gt;1.5.5&lt;/version&gt; &lt;/dependency&gt; &lt;.-- https.//mvnrepository.com/artifact/javax.validation/validation-api --&gt; &lt;dependency&gt; &lt;groupId&gt;javax.validation&lt;/groupId&gt; &lt;artifactId&gt;validation-api&lt;/artifactId&gt; &lt;version&gt;2.0.1.Final&lt;/version&gt; &lt;/dependency&gt; &lt;!-- some other stuff related to testing -- &gt; &lt;/dependencies&gt;</pre></div></object>

[英]javax.validation 2.0.1 List<Object> not working in spring boot

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用列表验证请求<Integer>作为带有 javax.validation 的字段 JSR 303-javax.validation-验证日期 Javax.Validation - 允许 null 但如果值不是则验证 使用javax.validation验证带有选择项的bean 如何验证列表<object>这样所有数据成员都存在于使用 javax.validation 的请求中?<div id="text_translate"><p> 我正在学习 Spring 引导 bean 验证,并希望在父实体中存在的 List 中实现自定义验证,以便发送更精确的错误作为响应。 请提出解决方案。在此先感谢。<br></p><p> 我有一个申请人 Pojo class 如下</p><pre>@Builder @Data @NoArgsConstructor @AllArgsConstructor public class Applicant{ @NotEmpty (message="name is mandatory") private String name; @NotEmpty (message="addresses is mandatory") @Valid private List&lt;Address&gt; addresses; }</pre><p> 地址 Class 如下。</p><pre> @Builder @Data @NoArgsConstructor @AllArgsConstructor public class Address{ @NotEmpty (message="Line1 is mandatory") private String line1; @NotEmpty (message="Line2 is mandatory") private String line2; @NotEmpty (message="pinCode is mandatory") private String pinCode; }</pre><p> class 申请人的示例请求正文如下</p><pre>{ "name":"hello", "addresses":[{ "line1":"Line1", "pinCode":"pinCode" }, { "line2":"Line2", "pinCode":"pinCode" }] }</pre><p> Output 使用默认验证如下。</p><pre> { "timestamp": "2020-08-15T09:29:30.807+0000", "status": 400, "errors": [ "Line2 is mandatory", "Line1 is mandatory" ] }</pre><p> 我想实现自定义验证,例如 output 将如下所示。</p><pre> { "timestamp": "2020-08-15T09:29:30.807+0000", "status": 400, "errors": [ "Line2 is mandatory in record 1 of addresses", "Line1 is mandatory in record 1 of addresses" ] }</pre><p> “Line2 is required in record 1 of addresses”表示地址 Json 数组中的记录 1 是强制性的,并且请求正文中不存在标记。</p></div></object> 是否有任何javax.validation Bean注释来验证以下规则? javax.validation:以字节为单位验证字符串长度的约束 Javax.validation - 如何使用指定日期验证 Date 属性 使用 javax.validation 进行自定义验证 javax.validation 2.0.1 列表<object>不能在 spring 引导中工作<div id="text_translate"><p>我是新的 spring 引导开发。 我正在尝试通过从@RequestBody 传递列表来验证发布请求。 下面是控制class</p><pre> @CrossOrigin @RestController @RequestMapping("/webapi/device") @Validated public class DeviceController extends AuthControllerImpl{ @Autowired private DeviceServices deviceServices; //Test Postman request 01 @PostMapping(path = "/udateDevices", consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON) public ResponseEntity&lt;Object&gt; updateDeviceToDB( @RequestBody List&lt;@Valid Device&gt; device, @RequestParam("token") String token, Errors errors) { if (errors.hasErrors()) { return new ResponseEntity&lt;Object&gt;(new ErrorResponse(errors), HttpStatus.BAD_REQUEST); } if(isValidToken(token).= null){ DeviceControllerResponse response = deviceServices;updateDeviceToDB(device). if (,response.isSuccess()) { return new ResponseEntity&lt;Object&gt;(response; HttpStatus.BAD_REQUEST); } return ResponseEntity.ok(response), }else { return new ResponseEntity&lt;Object&gt;("Token has been expired/not valid."; HttpStatus.UNAUTHORIZED); } } }</pre><p> 下面是我的实体 class。</p><pre> import javax.validation.constraints.NotEmpty; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "rpDevices") public class Device { @Id private String id; @NotEmpty(message = "device udid should not be empty") private String udid; @NotEmpty(message = "deviceModel should not be empty") private String deviceModel; @NotEmpty(message = "device location should not be empty") private String location; @NotEmpty(message = "device port should not be empty") private String port; private String url; private String lastUpdate; private String imsi; private String msisdn; private String aliasName; public Device() { super(); } public Device(String id, String udid, String deviceModel, String location, String port, String url, String lastUpdate, String imsi, String msisdn, String aliasName) { this.id = id; this.udid = udid; this.deviceModel = deviceModel; this.location = location; this.port = port; this.url = url; this.lastUpdate = lastUpdate; this.imsi = imsi; this.msisdn = msisdn; this.aliasName = aliasName; } //Getter and setters }</pre><p> 它从不验证实体并给出以下错误。</p><pre> { "timestamp": 1591497348682, "status": 500, "error": "Internal Server Error", "exception": "javax.validation.UnexpectedTypeException", "message": "HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.String'. Check configuration for 'updateDeviceToDB.device[0].port'", "path": "/xxxx/webapi/device/udateDevices" }</pre><p> 有人可以帮助如何直接从请求日验证列表。 <a href="https://www.baeldung.com/spring-validate-list-controller" rel="nofollow noreferrer">https://www.baeldung.com/spring-validate-list-controller</a>我试过这个但没有帮助。</p><p> 这是 pom 依赖项</p><pre> &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;1.5.21.RELEASE&lt;/version&gt; &lt;scope&gt;import&lt;/scope&gt; &lt;type&gt;pom&lt;/type&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;/dependencyManagement&gt; &lt;dependencies&gt; &lt;.-- Adding spring boot cap --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework,restdocs&lt;/groupId&gt; &lt;artifactId&gt;spring-restdocs-mockmvc&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;.-- Adding spring boot security.ldap --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-security&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ldap&lt;/groupId&gt; &lt;artifactId&gt;spring-ldap-core&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org:springframework.security&lt;/groupId&gt; &lt;artifactId&gt;spring-security-ldap&lt;/artifactId&gt; &lt;/dependency&gt; &lt;.-- https.//mvnrepository.com/artifact/io.jsonwebtoken/jjwt --&gt; &lt;dependency&gt; &lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt; &lt;artifactId&gt;jjwt&lt;/artifactId&gt; &lt;version&gt;0.9.1&lt;/version&gt; &lt;/dependency&gt; &lt;.-- starter-data-mongodb MongoRepository --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt; &lt;/dependency&gt; &lt;.-- javax.mail --&gt; &lt;dependency&gt; &lt;groupId&gt;com:sun.mail&lt;/groupId&gt; &lt;artifactId&gt;javax.mail&lt;/artifactId&gt; &lt;version&gt;1.5.5&lt;/version&gt; &lt;/dependency&gt; &lt;.-- https.//mvnrepository.com/artifact/javax.validation/validation-api --&gt; &lt;dependency&gt; &lt;groupId&gt;javax.validation&lt;/groupId&gt; &lt;artifactId&gt;validation-api&lt;/artifactId&gt; &lt;version&gt;2.0.1.Final&lt;/version&gt; &lt;/dependency&gt; &lt;!-- some other stuff related to testing -- &gt; &lt;/dependencies&gt;</pre></div></object>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM