원인 1. Mapper(XML) id가 다를 경우 - XML의 <select id="..." 값과 DAO의 메서드명이 다른 경우 2. parameterType과 bean의 alias 명이 틀린 경우 3. Mapper(XML)의 namespace와 DAO명이 다른 경우 4. mybatis config에 Mapper가 정의되어있지 않은 경우 5. Mapper에 정의된 namespace가 같은 application 내에 중복될 경우 6. build가 안 된 경우
해결 1. 가능하면 DAO의 메서드명을 복사해서 XML의 id값에 붙여넣는 것을 생활화 2. mybatis의 alias 명과 parameterType 및 resultMap의 type명이 같은지 확인 3. namespace 등 경로가 맞는지 Ctrl+마우스 클릭으로 확인하기
Mapped Statements collection does not contain value for pms.dao.ProjSetDAO.getAllMemList
프로젝트 열람 권한 설정에서 전체 직원 목록을 불러오는 작업을 하는 중에 JSONData는 정상적으로 넘어갔으나 쿼리에서 가져오지 못 하고 있었다.
쿼리를 DBeaver에 실행했을 때 정상적으로 작동하는 것을 확인했으니 쿼리 문제는 아닌 것으로 파악되었다.
그래서 에러를 자세히 살펴보니, Controller > Service > DAO까지는 잘 넘어갔으나, DAO에서 XML로 넘어간 이후에 에러가 발생한 것으로 보였다.
이는 보통 XML에서 설정한 id값과 DAO의 메서드명이 달라서 XML에서 DAO의 메서드명을 찾지 못해 쿼리를 실행하지 못 하는 경우에 발생한다.
내 경우에도 DAO의 메서드명은 getAllMemList지만, XML에서는 getallMemList여서 발생한 에러였다.
415 Error axios.min.js:2 Uncaught (in promise) Error: Request failed with status code 415
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryjrwQHbUAHDLIvGsO;charset=UTF-8' not supported
Content Type Error로 인해클라이언트단에서 보낸 FormData를 Back단에서 처리하지 못해서 발생하는 에러
Key Point - FormData >> JSON.stringify() - 'Content-Type' : 'application/json' - model 사용하기
Vue에서 FormData를 이용하여 데이터를 전송하고 Controller단에서 request.getParameter로 받아 처리하는 방식을 사용하다가, 매번 Controller에서 request.getParameter로 필요한 변수들을 받아 setXXX 로 담아주는 것은 한계도 있고 Controller단에서 처리하는 것은 썩 좋은 방법은 아니라 Front단에서 전송한 데이터를 VO자체에 담아주기 위해 컨트롤러 파라미터에 "@RequestBody UserVO user"를 추가해서 테스트 했는데 위와 같은 에러가 발생했다.
회사 동료에게 조언을 얻어 일단 FormData 대신 Json데이터로 파싱해서 보내보기로 했다.
JSON.stringify()로 JSON데이터 전송하기
// 전송할 데이터를 json형식으로 만들기
const data = {
"password" : self.confirmPw,
"email" : list.email,
"userSn" : list.userSn
}
// json형식으로 만든 데이터를 JSON으로 변환
const jsonData = JSON.stringify(data);
// 제대로 변환되었는지 콘솔에서 확인
console.log(data);
console.log(jsonData);
axios.post('/pmsProject/users/uptUserData.do', jsonData).then(function(){
alert('save complete');
self.getlist();
});
self.changeToInfo();
이에 따라 컨트롤러도 변경해주었다.
// 정보 수정
@RequestMapping(value = "/users/uptUserData.do", method = RequestMethod.POST)
@ResponseBody
public Object uptUserData(@RequestBody UserVO user) {
// HttpServletRequest request 삭제
// Front단에서 보내준 정보를 변수에 담기
// String password = request.getParameter("password");
// String email = request.getParameter("email");
// int userSn = Integer.parseInt(request.getParameter("userSn"));
// 새로운 userVO 객체를 생성해서 변수값 넣어주기
// UserVO user = new UserVO();
// user.setPassword(password);
// user.setEmail(email);
// user.setUserSn(userSn);
// 변수값이 설정된 객체(VO)를 parameter로 담아 보내주기
return service.uptUserData(user);
}
기존의 코드(주석처리)를 지운다면 훨씬 간결하게 작성할 수 있는 것을 확인할 수 있다.
하.지.만 여전히 에러는 그대로였다..
Content-Type 설정
에러메시지를 잘 보면
'Content type 'multipart/form-data;boundary=----WebKitFormBoundaryjrwQHbUAHDLIvGsO;charset=UTF-8' not supported' 라고 되어있는데, 기본적으로 axios.post를 사용할 때 multipart/form-data로 디폴트로 잡혀있는 것 같았다.
해결방법은 Content type을 application/json으로 명시해서 보내주면 된다.
- No converter found for return value fo type: class java.util.HashMap Error-
"No converter found for return value of type: class java.util.HashMap" Error No converter found for return value of type:XXX ajax 통신 과정에서 에러에 표시된 타입을 JSON으로 변환시키지 못함
>> HashMap 타입을 JSON 타입으로 변환하기
Maven Project로 변환한 이유가 "No converter found for return value of type: class java.util.HashMap" 에러 때문이었다.
Front단(Vue)에서 ajax통신을 이용하여 Controller단으로 json 데이터를 보내고, DB에서 데이터를 가져와 HashMap에 담아 return 해주는 과정에서 HashMap을 JSON으로 변환시켜줘야 하는데 하지 못했다는 에러이다.
DB에서 정상적으로 데이터를 가져온 화면
에러 문구
이 문제를 Dynamic Web Project 내에서 해결하려고 했으나, Maven에서 설정해주는 문구의 jar 파일을 찾지 못해 Maven Project로 변환해서 pom.xml에 추가해주었다.