2013-04-22 48 views
0

我正试图找到在我的Spring MVC应用程序中显示正确的验证消息的方法。Spring MVC - REST Web服务。 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(); 
} 
+1

当你得到验证错误你有什么POST数据? – 2013-04-22 04:58:14

+0

不知道我理解你的问题。我使用id> 500发布JSON以查看验证是否正常工作。有用。但是我得到了上面的一般信息。 – 2013-04-22 15:13:19

+0

看看在['的API BindingResult'(http://static.springsource.org/autorepo/docs/spring/3.2.0.M1/api/org/springframework/validation/Errors.html#getAllErrors( ))。那里有方法,比如'getFieldError()',它会返回受影响的字段。 – 2013-04-22 15:25:22

回答

1

getAllErrors()返回List<ObjectError>。你应该重复这些。

你的方法更改为类似

@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

+0

它仍然显示一般错误信息。没有显示“BindingResult”。即使ErrorCount为0.不知道发生了什么。 – 2013-04-23 02:14:55

+0

什么显示一般错误信息?如果错误计数为0,那么'hasErrors()'应该返回false。 – 2013-04-23 02:30:21

+0

'验证失败:com.springmvcsample.controller.Person'。有一个验证失败,我知道它是什么。但BindingResult不包含任何内容。 – 2013-04-23 02:32:17