[ajax]분명 success인데 왜 계속 error로 가는걸까?
DB저장도 잘되고 controller를 디버그에서 확인해보니 result값도 정상적으로 잘 작동되었는데 화면에서만 오면 ajax에서 success를 타지않고 error로 빠져버렸다.
왜일까?
문제와 원인
controller 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21"/admin/new") (value =
public BooleanAndMessageResult save(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestBody List<Admin> list) {
BooleanAndMessageResult result = new BooleanAndMessageResult();
Site site = (Site) request.getAttribute("site");
for (Admin a : list) {
a.setSiteid(site.getSiteid());
}
result.setResult(true);
result.setMessage("정상적으로 등록 되었습니다.");
try {
adminService.insertAdminList(list);
} catch (Exception e) {
result.setResult(false);
result.setMessage("등록에 실패 하였습니다.");
LOGGER.error("error : ", e);
}
return result;
}js코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30$.confirm({
theme: 'supervan',
title: '운영정보관리 저장',
content: '저장하시겠습니까?',
confirmButton: '예',
cancelButton: '아니오',
confirm: function(){
$.ajax({
type: "POST"
, url: "/admin/new"
, contentType : "application/json; charset:utf-8"
, data: JSON.stringify(jList)
, dataType: 'json'
, success: function(data){
if(data.result == true){
alert("저장에 성공했습니다.");
setTimeout(function() {location.reload(true);}, 2000);
} else if(data.result == false){
alert(data.message);
return false;
}
}
, error: function(request,status,error){
alert("에러가 발생했습니다. 새로고침합니다.");
location.href = "/admin/infosetting";
}
});
},
cancel: function(){}
});
위 코드는 한 가지 잘못된 점이 있다.
원인: @ResponseBody 누락
@ResponseBody 어노테이션을 이용하면 자바 객체를 HTTP 응답 분문의 객체로 변환하여 클라이언트에 전송 할 수 있다.
body에 리턴값을 담아주지 않았기때문에 ajax의 success가 아닌 error로 빠진것이다.
해결코드
controller코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22"/admin/new") (value =
// 까먹자말고 추가
public BooleanAndMessageResult save(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestBody List<Admin> list) {
BooleanAndMessageResult result = new BooleanAndMessageResult();
Site site = (Site) request.getAttribute("site");
for (Admin a : list) {
a.setSiteid(site.getSiteid());
}
result.setResult(true);
result.setMessage("정상적으로 등록 되었습니다.");
try {
adminService.insertAdminList(list);
} catch (Exception e) {
result.setResult(false);
result.setMessage("등록에 실패 하였습니다.");
LOGGER.error("error : ", e);
}
return result;
}js코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30$.confirm({
theme: 'supervan',
title: '운영정보관리 저장',
content: '저장하시겠습니까?',
confirmButton: '예',
cancelButton: '아니오',
confirm: function(){
$.ajax({
type: "POST"
, url: "/admin/new"
, contentType : "application/json; charset:utf-8"
, data: JSON.stringify(jList)
, dataType: 'json'
, success: function(data){
if(data.result == true){
alert("저장에 성공했습니다.");
setTimeout(function() {location.reload(true);}, 2000);
} else if(data.result == false){
alert(data.message);
return false;
}
}
, error: function(request,status,error){
alert("에러가 발생했습니다. 새로고침합니다.");
location.href = "/admin/infosetting";
}
});
},
cancel: function(){}
});
그래도 해결이 안된다면?
ajax에서 잘못된 dataType설정했을 가능성이 높다!
jQuery ajax의 setting 중 dataType은 response를 어떤 데이터 형식으로 파싱할 지를 설정하는 것이다.dataType: 'json'
으르 설정했기에 리턴타입을 json으로 주어야하는데 단순 String타입으로 준건 아닌지 체크해보자.
데이터형식이 맞지않으면 ajax의 success가 아닌 error로 빠진다.