2013-04-22 1 views
0

Spring MVC 애플리케이션에서 적절한 유효성 검증 메시지를 표시하는 방법을 찾으려고합니다.스프링 MVC - REST 웹 서비스. 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 데이터가 있습니까? –

+0

귀하의 질문에 대한 이해가 확실하지 않습니다. 유효성 검사가 작동하는지 확인하기 위해 id> 500 인 JSON을 게시 중입니다. 그것은 작동합니다. 그러나 나는 위의 일반화 된 메시지를 얻는다. –

+0

[BindingResult API] (http://static.springsource.org/autorepo/docs/spring/3.2.0.M1/api/org/springframework/validation/Errors.html#getAllErrors())). 영향을받는 필드를 반환하는'getFieldError()'와 같은 메소드가 있습니다. –

답변

1

getAllErrors()List<ObjectError>을 반환합니다. 그것들을 반복해야합니다.

@Max 같은 일부 제약 위에서 사용되는 기본 메시지를 설정하는 데 사용할 수있는 message 필드가

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

비슷한 귀하의 방법을 변경

.

@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입니다. –

+0

일반적인 오류 메시지가 정확히 무엇입니까? 에러 카운트가 0이면, hasErrors()는 false를 반환해야한다. –

+0

'인증 실패 : com.springmvcsample.controller.Person'. 유효성 검사 오류가 있으며 그 오류가 무엇인지 압니다.그러나 BindingResult에는 아무 것도 포함되어 있지 않습니다. –