简体   繁体   English

如何验证列表<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?

I'm learning the Spring Boot bean validation and wanted to implement custom validation in List present in the parent entity in such as way that more precise error is sent in response.我正在学习 Spring 引导 bean 验证,并希望在父实体中存在的 List 中实现自定义验证,以便发送更精确的错误作为响应。 Please suggest solution.Thanks in advance.请提出解决方案。在此先感谢。

I have a Applicant Pojo class as follows我有一个申请人 Pojo class 如下

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Applicant{
    @NotEmpty (message="name is mandatory")
    private String name;
    @NotEmpty (message="addresses is mandatory")
    @Valid
    private List<Address> addresses;
}

Address Class is as follows.地址 Class 如下。

@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;
}

Sample Request body for the class Applicant is as follows class 申请人的示例请求正文如下

{
  "name":"hello",
  "addresses":[{
    "line1":"Line1",
    "pinCode":"pinCode"
  },
  {
    "line2":"Line2",
    "pinCode":"pinCode"
  }]
}

Output using default validation is as follows. Output 使用默认验证如下。

{
    "timestamp": "2020-08-15T09:29:30.807+0000",
    "status": 400,
    "errors": [
        "Line2 is mandatory",
        "Line1 is mandatory"
    ]
}

I want to implement custom validation is such as way that the output will be as follows.我想实现自定义验证,例如 output 将如下所示。

{
    "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"
    ]
}

"Line2 is mandatory in record 1 of addresses" will indicate that the record 1 in Address Json Array is mandatory and the tag is not present in the request body. “Line2 is required in record 1 of addresses”表示地址 Json 数组中的记录 1 是强制性的,并且请求正文中不存在标记。

I have added the code in the repository - https://github.com/greenlearner01/rest-api-validation/tree/master/userManagementApp我已经在存储库中添加了代码 - https://github.com/greenlearner01/rest-api-validation/tree/master/userManagementApp

Now the error message will look like below(it's not exactly same as you asked for but I think very close)-现在错误消息将如下所示(它与您要求的不完全相同,但我认为非常接近)-

 {
   "status": "BAD_REQUEST",
   "errors": [
     "addresses[2].line1:must not be null",
     "addresses[2].line2:must not be null",
     "addresses[0].line1:must not be null",
     "addresses[1].line2:must not be null"
   ],
   "timestamp": "2020-08-15T17:52:31.138",
   "path": "uri=/user"
 }

Here Important thing is to add the @ControllerAdvice where the ConstraintViolationException is taken care of.这里重要的是添加 @ControllerAdvice 来处理 ConstraintViolationException 。

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 的字段 - Validate request with List<Integer> as a field with javax.validation javax.validation 来验证值列表? - javax.validation to validate list of values? 使用javax.validation验证带有选择项的bean - using javax.validation to validate bean with choices Javax.validation - 如何使用指定日期验证 Date 属性 - Javax.validation - how to validate a Date attribute with a specifies date 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 JSR 303-javax.validation-验证日期 - JSR 303 - javax.validation - Validate a date Javax.Validation - 允许 null 但如果值不是则验证 - Javax.Validation - allow null but validate if the value is not 在Spring 4 MVC中如何使用javax.validation和JSON请求? - How to use javax.validation and JSON request in Spring 4 MVC? 如何使用javax.validation将@NotNull约束应用于类中的所有字段? - How can I apply a @NotNull constraint to all fields in a class using javax.validation? 如何在 gradle 项目中导入 javax.validation(用于使用 @Valid) - How to import javax.validation(for using @Valid) in gradle project
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM