service에서 발생한 exception이 controler로 넘어오질 않습니다
- 작성자 :
- 김*훈
- 작성일 :
- 2015-06-28 18:07:51
- 조회수 :
- 2,098
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
@RequestMapping(value = "/main.do")
public void operate(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
//RequestAdapter reqAdapter = new RequestAdapter();
Map param = receiveData(request); //(Map)reqAdapter.convert(request);
logger.debug(String.format("\n\nparam=%s\n", JSONUtil.serializeObject(param)));
Map<String, String>paramMap = (Map)param.get("p");
String serviceName = paramMap.get("service");
String methodName = paramMap.get("method");
Object bean = getWebApplicationContext().getBean(serviceName);
logger.debug(String.format("bean=%s", bean.toString()));
Method method = getMethod(bean, methodName);
Map<String, Object>result = new HashMap<String, Object>();
Map<String, Object>data = new HashMap<String, Object>();
method.invoke(bean, new Object[] { param, request, result, data });
if (result.size() > 0) {
//logger.debug(String.format("result=%s", result));
ResponseData.sendResponseData(request, response, result, data);
} else {
ResponseData.sendResponseData(request, response, ResponseData.getResponseResult(ResponseData.STATUS_SUCESS, "Request has been processed successfully"), data);
}
} catch (Exception e) {
logger.error("\n" + ObjectUtil.getMessage(e));
String errMsg = "";
errMsg = MainUtil.getErrMsg(e);
ResponseData.sendResponseData(request, response, ResponseData.getResponseResult(ResponseData.STATUS_ERROR, errMsg));
}
이런 식의 코드인데~ ajax형태로 service와 sqlId를 map에 넣어서 main.do를 호출하는 형태입니다.
문제는 exception처리를 하려고 하는데 문제는 service안에서 발생한 sql오류는
catch로 가지 않고 if (result.size() > 0) { 이 부분으로 와버립니다.
service안에서는 catch 부분으로 오류메세지를 처리하는데
controler로 넘어오면 정상적으로 처리해버립니다. 뭐가 잘못된 걸까요?
jdbc오류는 catch로 잘 잡히는데 service안에서의 NullPointerException이나 sql에러는
Controller에서 exception으로 처리가 되질 않습니다.
controller에서 service호출 하는 부분인 method.invoke를 try catch로 감싸면 되는거 아닌가요?
public void operate(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
//RequestAdapter reqAdapter = new RequestAdapter();
Map param = receiveData(request); //(Map)reqAdapter.convert(request);
logger.debug(String.format("\n\nparam=%s\n", JSONUtil.serializeObject(param)));
Map<String, String>paramMap = (Map)param.get("p");
String serviceName = paramMap.get("service");
String methodName = paramMap.get("method");
Object bean = getWebApplicationContext().getBean(serviceName);
logger.debug(String.format("bean=%s", bean.toString()));
Method method = getMethod(bean, methodName);
Map<String, Object>result = new HashMap<String, Object>();
Map<String, Object>data = new HashMap<String, Object>();
method.invoke(bean, new Object[] { param, request, result, data });
if (result.size() > 0) {
//logger.debug(String.format("result=%s", result));
ResponseData.sendResponseData(request, response, result, data);
} else {
ResponseData.sendResponseData(request, response, ResponseData.getResponseResult(ResponseData.STATUS_SUCESS, "Request has been processed successfully"), data);
}
} catch (Exception e) {
logger.error("\n" + ObjectUtil.getMessage(e));
String errMsg = "";
errMsg = MainUtil.getErrMsg(e);
ResponseData.sendResponseData(request, response, ResponseData.getResponseResult(ResponseData.STATUS_ERROR, errMsg));
}
이런 식의 코드인데~ ajax형태로 service와 sqlId를 map에 넣어서 main.do를 호출하는 형태입니다.
문제는 exception처리를 하려고 하는데 문제는 service안에서 발생한 sql오류는
catch로 가지 않고 if (result.size() > 0) { 이 부분으로 와버립니다.
service안에서는 catch 부분으로 오류메세지를 처리하는데
controler로 넘어오면 정상적으로 처리해버립니다. 뭐가 잘못된 걸까요?
jdbc오류는 catch로 잘 잡히는데 service안에서의 NullPointerException이나 sql에러는
Controller에서 exception으로 처리가 되질 않습니다.
controller에서 service호출 하는 부분인 method.invoke를 try catch로 감싸면 되는거 아닌가요?
A
김종훈님 안녕하세요.
표준프레임워크센터입니다.
문의주신 내용을 파악해보면 서비스구현체(ServiceImpl)나 DAO에서 발생한 Exception에 대해 try catch finally를 사용하신 것으로 보입니다.
서비스단에서 try catch로 감싸서 처리하시면 서비스단에서 예외처리가 끝난 것으로 간주하여, 상위 클래스인 컨트롤러에서 예외로 인식하지 않습니다.
컨트롤러 단에서 예외처리를 하시려면 서비스단에서 try catch문을 사용하지 마시고, 서비스나 DAO 메소드 선언부에 throws Exception을 사용하시어 처리하시면 되겠습니다.
감사합니다.
표준프레임워크센터입니다.
문의주신 내용을 파악해보면 서비스구현체(ServiceImpl)나 DAO에서 발생한 Exception에 대해 try catch finally를 사용하신 것으로 보입니다.
서비스단에서 try catch로 감싸서 처리하시면 서비스단에서 예외처리가 끝난 것으로 간주하여, 상위 클래스인 컨트롤러에서 예외로 인식하지 않습니다.
컨트롤러 단에서 예외처리를 하시려면 서비스단에서 try catch문을 사용하지 마시고, 서비스나 DAO 메소드 선언부에 throws Exception을 사용하시어 처리하시면 되겠습니다.
감사합니다.