【问题标题】:Validation a request parameter against custom constraints using an XML file使用 XML 文件针对自定义约束验证请求参数
【发布时间】:2017-05-07 19:50:04
【问题描述】:

我正在使用 spring 开发一个 rest web 服务,我正在尝试验证接收到的对象:

@RequestMapping(value="/sendResult", method = RequestMethod.POST)  
public @ResponseBody String createResult(@Valid Result result, @RequestParam("image") MultipartFile image) {
}

这是 Result 模型中的验证方法:

@AssertTrue(message="votesCast field should be less or equal than registredVoters field")
      private boolean isValid() {
        return ((this.votesCast <= this.registredVoters) && (this.votesCast == this.validVotes + this.invalidVotes) );
      }

我的问题是如何使我的验证约束可配置,我找到了Hibernate validator constraints in XML。 但是以这种方式如何将字段比较放在 XML 文件中,就像我在 isValid 方法中所做的那样? 提前致谢

【问题讨论】:

    标签: java xml spring validation


    【解决方案1】:

    您可以像这样在实体类中验证您的模型:

    public class MultipartFile {
    
        @Size(min = 3, max = 20)
        String name;
        //...
    }
    

    默认情况下,您的错误消息将是

    大小必须在 3 到 20 之间。

    要更改消息,您应该使用如下注释:

    @Size(min = 3, max = 20, message = "your own message")
    

    或者您可以在资源目录中创建 ValidationMessages.properties 文件,并在其中编写如下内容:

    javax.validation.constraints.Size.message = Size must be between {min} and {max}. It is my own error message!
    

    在你的 Post 方法中会是这样的:

    @RequestMapping(value="/sendResult", method = RequestMethod.POST)
    public @ResponseBody String createResult(@ModelAttribute("image") @Valid
        MultipartFile image, BindingResult result) {
        if (result.hasErrors()) {
            //...
        } else {
            //...
        }
    }
    

    也许你需要这样的东西:

    <!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
    
    <hibernate-mapping>
       <class name="User" table="USER">
          <meta attribute="class-description">
             This class contains the user detail. 
          </meta>
          <id name="id" type="int" column="id">
             <generator class="native"/>
          </id>
          <property name="name" column="name" type="string"/>
       </class>
    </hibernate-mapping>
    

    【讨论】:

    • 已经完成了。我的问题是关于使用 XML 文件而不是注释
    • 但是为什么要使用 XML?注释更易读、更方便。
    • 规则必须随时可以修改,无需修改java代码。
    • 我编辑了我的答案,如果你需要的话,请告诉我。
    • 这就是我想要的,但是如何检查该 xml 文件中的 votesCast
    【解决方案2】:

    希望对您有所帮助。使用 Spring Validator 接口验证您的值

    1. 创建验证类(注意。你可以添加任何你想要的条件):


    public class ResultValidator implements Validator {
    
    @Override
    public boolean supports(Class<?> aClass) {
        return Result.class.isAssignableFrom(aClass);
    }
    
    @Override
    public void validate(Object o, Errors errors) {
        Result r = (Result)o;
        if(r.votesCast > r.registredVoters){
           errors.rejectValue("registredVoters","RegistredVoters is not valid")
        }
    
        if(r.votesCast != r.validVotes + r.invalidVotes)){
           errors.rejectValue("votesCast","VotesCast is not valid")
        }
    }
    

    其中rejectValue参数:

    • 第一个是无效的字段
    • 第二个是显示为消息的消息。

    您还可以使用ValidationUtils 检查空值和空格。 2. 在您的控制器中添加以下代码:

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new ResultValidator());
    }
    

    3.只需在方法参数中添加@Valid注解即可。

    查看相关帖子:http://javainsimpleway.com/spring-mvc-form-validation-with-custom-validator/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多