2011-01-11 3 views
2

Java EE/Spring MVC를 사용하는 백엔드 시스템에 AJAX/JSON과 연결된 HTML/jQuery가 포함 된 웹 응용 프로그램이 있습니다.JavaScript - Spring MVC 기반의 백엔드 시스템에서 오류 메시지를 표시하는 방법

프론트 엔드에서

, 사람은 양식을 기입하여 만들 수 있습니다 후 제출되고이 jQuery 코드가 실행 : 가장 좋은 경우

var person = $(this).serializeObject(); 
$.postJSON("add/", person, function(data) { 
    alert("Person with ID "+data.person.id+"' added successfully"); 
}); 

는 사람이 만들어지고 난거야 Person 객체를 얻으면 data.person.*으로 값에 액세스 할 수 있습니다.

이제 백엔드 시스템으로 전송되는 데이터의 유효성을 검사하고 오류가 발생하면 첫 번째 단계에서 경고 오류 메시지를 표시하려고합니다.

나는 백엔드 시스템에서 이런 짓을 :

@RequestMapping(value="add/", method=RequestMethod.POST) 
public @ResponseBody Map<String, ? extends Object> addPerson(@RequestBody Person p, HttpServletResponse response) { 
    Set<ConstraintViolation<Person>> failures = validator.validate(p); 
    if (!failures.isEmpty()) { 
     response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
     return validationMessages(failures); 
    } else { 
     Person person = this.personService.addPerson(p); 
     return Collections.singletonMap("person", new SerialPerson(person.getId(), person.getName(), ...)); 
    } 
} 

// internal helpers 
private Map<String, String> validationMessages(Set<ConstraintViolation<Person>> failures) { 
    Map<String, String> failureMessages = new HashMap<String, String>(); 
    for (ConstraintViolation<Person> failure : failures) { 
     failureMessages.put(failure.getPropertyPath().toString(), failure.getMessage()); 
     System.out.println(failure.getPropertyPath().toString()+" - "+failure.getMessage()); 
    } 
    return failureMessages; 
} 

내 Person 객체가 주석, 나는 그 예를 들어, 콘솔에 System.out.println(failure.getPropertyPath().toString()+" - "+failure.getMessage());를 얻을 수있다 -

"이름은 1-30 사이에 있어야이가 문자"

그러나 frontend 시스템의 jQuery에서 어떻게 경고 메시지를 만들 수 있습니까?

도움을 주셔서 감사합니다. & 최고 감사합니다.

업데이트 : validationMessages 메소드를 발견 한 Spring MVC AJAX 예제에 링크하십시오. 그러나 오류 메시지를받는 방법도 없습니다.

해결 :

내가 전화를해야 :

jQuery.ajax({ 
    'type': 'POST', 
    'url': "add/", 
    'contentType': 'application/json', 
    'data': JSON.stringify(person), 
    'dataType': 'json', 
    'success': function(data) {alert("success");}, 
    'error': function(xhr) {alert(xhr.responseText);} 
}); 

답변

3

당신은이 같은 작업을 수행 할 수 있습니다

var person = $(this).serializeObject(); 
$.postJSON("add/", person, function(data) { 

    if(data.person) { 
     alert("Person with ID "+data.person.id+"' added successfully"); 
    } 

    else { 
     var errors = ""; 
     for(var key in data) if(data.hasOwnProperty(key)) { 
      errors += data[key] + "\n"; 
     } 

     alert(errors); 
    } 
}); 

당신도 나쁜 요청을 다시 보낼 필요가 없습니다 . 이게 니가 원하는거야?

UPDATE

당신은 스프링 소스에 표시된 코드를 사용할 수 있지만, 당신은 내가 선`것은 response.setStatus을 (제거하는 경우이 작동 jQuery.ajax

jQuery.ajax({ 
    type: 'POST', 
    url: "add/", 
    data: person, 
    dataType: "json", 
    success: function(data) { 
     alert("Person with ID "+data.person.id+"' added successfully"); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     var errorJSON = JSON.parse(XMLHttpRequest.responseText); //if this is JSON otherwise just alerting XMLHttpRequest.responseText will do 

     var errors = ""; 
     for(var key in errorJSON) if(errorJSON.hasOwnProperty(key)) { 
      errors += errorJSON[key] + "\n"; 
     } 

     alert(errors); 
    } 
}); 
+0

를 사용해야 할 것 HttpServletResponse.SC_BAD_REQUEST); 그렇지 않으면 작동하지 않습니다. 하지만 왜이 튜토리얼에서 http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/ 이것이 완료 되었습니까? – Tim

+0

업데이트가 표시되지 않습니다 ... – Tim

+0

@Tim 저의 글을 쓰고있는 동안, 실수를 저질렀다는 것을 깨달았습니다. 개념적으로 오류가 발생했기 때문에 잘못된 요청을 되돌려 보내는 것이 합리적입니다. 그러나 오류 메시지 세부 정보를 다시 보내는 방법을 모르겠습니다. (어쩌면 당신은 textStatus를 추측 할 수 ... 못생긴). 그래서 당신의 경우에는 오류 메시지를 다시 받기를 원하므로 줄을 제거해야합니다. –

관련 문제