【问题标题】:Spring MVC - REST Webservices. Bean Validation MessagesSpring MVC - REST Web 服务。 Bean 验证消息
【发布时间】:2013-04-14 21:55:57
【问题描述】:

我正在尝试找出在我的 Spring MVC 应用程序中显示正确验证消息的方法。

这是示例 Bean:

@Entity
@Table(name="employees")
public class Person {

    private Integer person_id;
    private String name;
    private String name2;
    private String email;
    private double phone;
    private String desc;

    @Id
    @Max(value=500)
    @Column (name="id")
    public Integer getPerson_id() {
        return person_id;
    }

    public void setPerson_id(Integer person_id) {
        this.person_id = person_id;
    }

    @NotNull
    @NotEmpty
    @Column (name="fn")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Column(name="ln")
    public String getName2() {
        return name2;
    }
    public void setName2(String name2) {
        this.name2 = name2;
    }

    @Email
    @Column (name="em", unique = true)
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name="phone")
    public double getPhone() {
        return phone;
    }
    public void setPhone(double phone) {
        this.phone = phone;
    }

    @Column (name="de")
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String toString() {
        return getName() + " - " + getName2() + " - " +  getEmail();
    }
}

我的控制器方法:

    //POST
    @RequestMapping(value="/persons", method = RequestMethod.POST, headers="Accept=*/*", 
                    consumes="application/json")
public String getAllPersons(@RequestBody @javax.validation.Valid Person p, BindingResult br){
    System.out.println( br.getAllErrors());

    personService.savePerson(p);
    return "redirect:persons.htm"; // redirects to the method below.
}

 //GET
 @RequestMapping(value="/persons", method =  RequestMethod.GET, headers="Accept=*/*", 
                    produces="application/json")
 @ResponseBody
 public List<Person> getAllPersons(){
   List<Person> persons = personService.listPersons();
   for (Person person : persons) {
    System.out.println(person.getEmail());
   }

   if ( persons == null ) {
      return null;
   } 

    return persons;
 }

这工作正常。但是当出现验证错误时。我只是收到简单的消息:

  validation failed for: com.springmvcsample.controller.Person

没有字段和验证失败。

如何获取验证失败的字段名?我认为我无法从 BindingResults 对象中获取归档名称。

我已经搜索了一个示例。但我得到了各种各样的例子,但没有像我需要做的那样。

我的异常处理方法:

@ExceptionHandler(Exception.class)
@ResponseBody
public String handleException( Exception e ) {
    return e.getMessage();
}

【问题讨论】:

  • 收到验证错误时有哪些 POST 数据?
  • 不确定我是否理解您的问题。我正在发布 id > 500 的 JSON 以查看验证是否有效。有用。但我得到了上述概括性信息。
  • 看看API of BindingResult。那里有一些方法,比如getFieldError(),会返回受影响的字段。
  • 谢谢。我会试试的。在使用 Spring MVC / REST 处理异常/错误时,您可能遇到过任何示例吗?我想了解这里的标准做法。
  • 不知道这里有没有标准。我通常使用BindingResult#hasErrors() 检查错误,然后使用BindingResult#getAllErrors() 返回List&lt;ObjectError&gt;,然后使用ObjectError#getDefaultMessage() 记录错误并返回错误页面。请记住,您实际上可以在验证注释中设置自己的错误消息。

标签: java rest spring-mvc error-handling bean-validation


【解决方案1】:

getAllErrors() 返回一个List&lt;ObjectError&gt;。你应该遍历那些。

将您的方法更改为类似的方法

@RequestMapping(value="/persons", method = RequestMethod.POST, headers="Accept=*/*", 
                consumes="application/json")
public String getAllPersons(@RequestBody @javax.validation.Valid Person p, BindingResult br){
    if (br.hasErrors()) {
        List<ObjectError> errors = br.getAllErrors();
        for (ObjectError error : errors) { // iterate through all the errors
            System.out.println(error.getDefaultMessage()); // or log it somewhere else
        }
        return "redirect:error.htm"; // some error page
    } else {
        personService.savePerson(p);
        return "redirect:persons.htm";
    }
}

@Max 这样的一些约束有一个message 字段,您可以使用它来设置上面使用的默认消息。

@Id
@Max(value=500, message = "The person id cannot be larger than 500.")
@Column (name="id")
public Integer getPerson_id() {
    return person_id;
}

使用它来添加自定义消息。

BindingResult 类有其他方法可用于查找导致验证错误的实际字段。 Take a look here.

【讨论】:

  • 它仍然显示一般错误信息。 BindingResult 未显示。甚至 ErrorCount 也是 0。不知道发生了什么。
  • 究竟是什么显示了一般错误信息?如果错误计数为 0,则 hasErrors() 应返回 false。
  • validation failed for: com.springmvcsample.controller.Person。验证失败,我知道它是什么。但 BindingResult 不包含任何内容。
  • 是的,hasErrors 返回 false。
  • 该消息来自哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2015-03-17
  • 1970-01-01
相关资源
最近更新 更多