繁体   English   中英

如何验证 Map<string, string> 以编程方式使用 Spring 验证器</string,>

[英]How to validate a Map<String, String> using Spring Validator programmatically

我有一个 Map,我从第三方的浏览器重定向回我的 Spring Controller,如下所示 -

@RequestMapping(value = "/capture", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void capture(@RequestParam
    final Map<String, String> response)
    {
        // TODO : perform validations first.
        captureResponse(response);
    }

在使用此负载之前,我需要进行重要的验证,包括首先检查 map 的非空值,然后在校验和验证中使用这些值。 因此,我想使用 Spring Validator 接口以编程方式验证我的有效负载。 但是,我找不到任何用于验证 Map 的验证器示例。

为了验证 Java Object,我了解如何通过将 object 和 BeanPropertyBindingResult 传递给验证器来调用验证器,如下所示 -

final Errors errors = new BeanPropertyBindingResult(object, objectName);
myValidator.validate(object, errors);
if (errors.hasErrors())
{
    throw new MyWebserviceValidationException(errors);
}

对于 Map,我可以看到有一个MapBindingResult class 扩展了AbstractBindingResult 我应该简单地使用它,并将我的 map 传递到Object object中,然后在验证器中将其转换回Map吗? 另外,如何在我的验证器中实现supports(final Class<?> clazz)的验证器方法? 它会像下面的代码片段一样,其中只能有一个验证器支持 HashMap 的这个通用 class 吗? 怎么感觉不太对。 (虽然这对我来说并不重要,因为我将注入我的验证器并直接使用它,而不是通过验证器注册表,但仍然很好奇。)

@Override
public boolean supports(final Class<?> clazz)
{
    return HashMap.class.equals(clazz);
}

因为有一个 MapBindingResult,我肯定 Spring 必须支持 Maps 进行验证,想知道如何。 所以想知道这是通往 go 的路,还是我走错了方向,还有更好的方法。

请注意,我想以编程方式而不是通过注释来执行此操作。

验证map里面的参数

为了按照特定映射验证您的 Map,您将需要一个自定义验证器。

因为这可能是一些用例, @RequestParam的验证可以使用org.springframework.validation注释来完成,例如

@GetMapping(value = "/search")
public ResponseEntity<T> search(@RequestParam 
   Map<@NotBlank String,@NotBlank String> searchParams,

虽然@NotBlank检查您的字符串是否不是"" ,但@NotNull可以验证非空参数,我猜这是您需要的。

另一种方法是为地图创建自定义约束注释。

您可以查看以下链接:

https://www.baeldung.com/spring-mvc-custom-validator

就像我想的那样,Spring Validator org.springframework.validation.Validator确实支持 Map 的验证。 我自己试了一下,确实有效!

我通过传入我需要验证的地图和该地图的标识符名称(用于全局/根级错误消息)创建了一个org.springframework.validation.MapBindingResult 这个 Errors 对象与要验证的地图一起在验证器中传递,如下面的代码片段所示。

final Errors errors = new MapBindingResult(responseMap, "responseMap");
myValidator.validate(responseMap, errors);
if (errors.hasErrors())
{
    throw new MyWebserviceValidationException(errors);
}

MapBindingResult扩展AbstractBindingResult并覆盖方法getActualFieldValue以提供自己的实现以从正在验证的地图中获取字段。

private final Map<?, ?> target;

@Override
protected Object getActualFieldValue(String field) {
    return this.target.get(field);
}

因此,在 Validator 中,我能够使用org.springframework.validation.ValidationUtils提供的所有有用的实用方法,就像我们在标准对象 bean 验证器中使用的那样。 例如 -

ValidationUtils.rejectIfEmpty(errors, "checksum", "field.required");

其中“校验和”是我地图中的一个键。 啊,传承之美! :)

对于其他重要的验证,我只是将 Object 转换为 Map 并编写了我的自定义验证代码。

所以验证器看起来像 -

@Override
public boolean supports(final Class<?> clazz)
{
    return HashMap.class.equals(clazz);
}
@Override
public void validate(final Object target, final Errors errors)
{
    ValidationUtils.rejectIfEmpty(errors, "transactionId", "field.required");
    ValidationUtils.rejectIfEmpty(errors, "checksum", "field.required");

    final Map<String, String> response = (HashMap<String, String>) target;
    // do custom validations with the map's attributes
    // ....
    // if validation fails, reject the whole map - 
         errors.reject("response.map.invalid");
}

验证列表<object>使用 Spring 验证器<div id="text_translate"><p>问题:如何在验证器中为 List 目标的错误设置正确的嵌套路径以调用其他验证器?</p><p> 代码参考: <a href="https://stackoverflow.com/questions/12680730/validate-a-list-of-nested-objects-with-spring-validator/25317726" rel="nofollow noreferrer">用于嵌套 object 的嵌套 spring 验证器</a></p><pre>public class AllergyDtoListValidator implements Validator { private AllergyDtoValidator allergyDtoValidator; @Override public boolean supports(Class&lt;?&gt; clazz) { return new TypeToken&lt;List&lt;AllergyDto&gt;&gt;() { }.getType().equals(clazz); } @Override public void validate(Object target, Errors errors) { allergyDtoValidator = new AllergyDtoValidator(); List&lt;AllergyDto&gt; request = (List&lt;AllergyDto&gt;) target; for (int i = 0; i &lt; request.size(); i++) { // below line causes the exception errors.pushNestedPath(String.valueOf(i)); ValidationUtils.invokeValidator(this.allergyDtoValidator, request.get(i), errors); errors.popNestedPath(); } } } public class AllergyDtoValidator implements Validator { @Override public boolean supports(Class&lt;?&gt; clazz) { return AllergyDto.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { AllergyDto request = (AllergyDto) target; log.info("Enter allergy validator {}", request.toString()); try { // field allergyTypeCode if (request.getAllergyTypeCode() == null || request.getAllergyTypeCode().isEmpty()) { errors.rejectValue("allergyTypeCode", "Cannot be null nor whitespace"); } else if (request.getAllergyTypeCode().length() &gt; 8) { errors.rejectValue("allergyTypeCode", "Exceed max length"); } // field allergyCode ValidationUtils.rejectIfEmptyOrWhitespace(errors, "allergyCode", "Cannot be null nor " + "whitespace"); if (request.getAllergyCode().= null &amp;&amp; request.getAllergyCode().length() &gt; 8) { errors,rejectValue("allergyCode"; "Exceed max length"). } // field allergyName if (request.getAllergyName().= null &amp;&amp; request.getAllergyName(),length() &gt; 66) { errors;rejectValue("allergyName". "Exceed max length"), } // field remarks ValidationUtils,rejectIfEmptyOrWhitespace(errors; "remarks". "Cannot be null nor whitespace"). if (request.getRemarks().= null &amp;&amp; request,getRemarks();length() &gt; 255) { errors.rejectValue("remarks", "Exceed max length"); } } catch (Exception e) { log.info("Exception {}", e). } log;info("allergy errors {}"; errors;toString()); } } public class AllergyDto implements Serializable { private static final long serialVersionUID = 2319040437020676767L; @JsonProperty("allergy_type_code") private String allergyTypeCode; @JsonProperty("allergy_code") private String allergyCode; @JsonProperty("allergy_name") private String allergyName; @JsonProperty("remarks") private String remarks; // getters and setters }</pre><p> 当我跑步时</p><pre>// req is List&lt;AllergyDto&gt; allergyDtoListValidator.validate(req, bindingResult);</pre><p> 我有异常</p><blockquote><p> org.springframework.beans.NotReadablePropertyException:bean class [java.util.ArrayList] 的无效属性“0”:bean 属性“0”不可读或具有无效的 getter 方法:getter 的返回类型是否与参数类型匹配二传手? at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:627) at org.springframework.beans.AbstractNestablePropertyAccessor.getNestedPropertyAccessor(AbstractNestablePropertyAccessor.java:843) at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyAccessorForPropertyPath(AbstractNestablePropertyAccessor.java:820 ) at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:615) at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:104) at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java: 228) 在 org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(Val idationUtils.java:252) at org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(ValidationUtils.java:191) at sg.gov.hpb.yhms.medical_service.validators.AllergyDtoValidator.validate(AllergyDtoValidator.java:32) at org.springframework .validation.ValidationUtils.invokeValidator(ValidationUtils.java:89) at org.springframework.validation.ValidationUtils.invokeValidator(ValidationUtils.java:56) at sg.gov.hpb.yhms.medical_service.validators.AllergyDtoListValidator.validate(AllergyDtoListValidator.java :32)</p></blockquote></div></object>

[英]Validate List<Object> using Spring validator

暂无
暂无

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

相关问题 使用Xtext验证器验证字符串 如何发送地图<string, string>使用来自 Spring MVC 的 @PathVariable</string,> 如何使用 java spring 验证来验证字符串长度? Spring @requestparam如何验证字符串在字符串列表中 验证列表<object>使用 Spring 验证器<div id="text_translate"><p>问题:如何在验证器中为 List 目标的错误设置正确的嵌套路径以调用其他验证器?</p><p> 代码参考: <a href="https://stackoverflow.com/questions/12680730/validate-a-list-of-nested-objects-with-spring-validator/25317726" rel="nofollow noreferrer">用于嵌套 object 的嵌套 spring 验证器</a></p><pre>public class AllergyDtoListValidator implements Validator { private AllergyDtoValidator allergyDtoValidator; @Override public boolean supports(Class&lt;?&gt; clazz) { return new TypeToken&lt;List&lt;AllergyDto&gt;&gt;() { }.getType().equals(clazz); } @Override public void validate(Object target, Errors errors) { allergyDtoValidator = new AllergyDtoValidator(); List&lt;AllergyDto&gt; request = (List&lt;AllergyDto&gt;) target; for (int i = 0; i &lt; request.size(); i++) { // below line causes the exception errors.pushNestedPath(String.valueOf(i)); ValidationUtils.invokeValidator(this.allergyDtoValidator, request.get(i), errors); errors.popNestedPath(); } } } public class AllergyDtoValidator implements Validator { @Override public boolean supports(Class&lt;?&gt; clazz) { return AllergyDto.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { AllergyDto request = (AllergyDto) target; log.info("Enter allergy validator {}", request.toString()); try { // field allergyTypeCode if (request.getAllergyTypeCode() == null || request.getAllergyTypeCode().isEmpty()) { errors.rejectValue("allergyTypeCode", "Cannot be null nor whitespace"); } else if (request.getAllergyTypeCode().length() &gt; 8) { errors.rejectValue("allergyTypeCode", "Exceed max length"); } // field allergyCode ValidationUtils.rejectIfEmptyOrWhitespace(errors, "allergyCode", "Cannot be null nor " + "whitespace"); if (request.getAllergyCode().= null &amp;&amp; request.getAllergyCode().length() &gt; 8) { errors,rejectValue("allergyCode"; "Exceed max length"). } // field allergyName if (request.getAllergyName().= null &amp;&amp; request.getAllergyName(),length() &gt; 66) { errors;rejectValue("allergyName". "Exceed max length"), } // field remarks ValidationUtils,rejectIfEmptyOrWhitespace(errors; "remarks". "Cannot be null nor whitespace"). if (request.getRemarks().= null &amp;&amp; request,getRemarks();length() &gt; 255) { errors.rejectValue("remarks", "Exceed max length"); } } catch (Exception e) { log.info("Exception {}", e). } log;info("allergy errors {}"; errors;toString()); } } public class AllergyDto implements Serializable { private static final long serialVersionUID = 2319040437020676767L; @JsonProperty("allergy_type_code") private String allergyTypeCode; @JsonProperty("allergy_code") private String allergyCode; @JsonProperty("allergy_name") private String allergyName; @JsonProperty("remarks") private String remarks; // getters and setters }</pre><p> 当我跑步时</p><pre>// req is List&lt;AllergyDto&gt; allergyDtoListValidator.validate(req, bindingResult);</pre><p> 我有异常</p><blockquote><p> org.springframework.beans.NotReadablePropertyException:bean class [java.util.ArrayList] 的无效属性“0”:bean 属性“0”不可读或具有无效的 getter 方法:getter 的返回类型是否与参数类型匹配二传手? at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:627) at org.springframework.beans.AbstractNestablePropertyAccessor.getNestedPropertyAccessor(AbstractNestablePropertyAccessor.java:843) at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyAccessorForPropertyPath(AbstractNestablePropertyAccessor.java:820 ) at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:615) at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:104) at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java: 228) 在 org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(Val idationUtils.java:252) at org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(ValidationUtils.java:191) at sg.gov.hpb.yhms.medical_service.validators.AllergyDtoValidator.validate(AllergyDtoValidator.java:32) at org.springframework .validation.ValidationUtils.invokeValidator(ValidationUtils.java:89) at org.springframework.validation.ValidationUtils.invokeValidator(ValidationUtils.java:56) at sg.gov.hpb.yhms.medical_service.validators.AllergyDtoListValidator.validate(AllergyDtoListValidator.java :32)</p></blockquote></div></object> 如何使用java验证字符串 如何使用SPRING REST将JSON请求映射到String 如何以编程方式针对架构验证JSON字符串? Spring - HttpMessageConversionException 使用带有 Map 的 ResponseEntity<string,jsonobject></string,jsonobject> Spring RequestParam Map <String,String>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM