728x90
반응형

Error

- maven project form-data 처리 -


KeyPoint
 - pom.xml dependency 추가
 - @RequestBody 삭제

 


 

 


415 error

토이 프로젝트를 진행하면서 vue를 사용하고 있다.

게시물 등록의 경우, 파일이 포함되어있지 않으면 form-data보다는 json형식으로 넘기는 것이 나아서 지금까지 구축된 화면들은 전부 headers : { 'Content-Type' : 'application/json' } 으로 데이터를 보냈다.

 

그런데 같이 토이프로젝트를 진행하는 친구의 화면에는 파일 첨부기능이 들어갈 예정이라 formData로 전송해야 하는데, json 형식처럼 진행하려다보니 에러가 발생했다.

 

https://heisely93.tistory.com/26?category=1036800 에서 이미 발생했던 에러이다. 이때는 그냥 json형식으로 전송하는 걸로 바꿨었는데, 이제는 정말로 필요해서 해결법을 찾아야 했다..

 

 

[Error] 415 error

Error - 415 Error & HttpMediaTypeNotSupportedException - 415 Error axios.min.js:2 Uncaught (in promise) Error: Request failed with status code 415 org.springframework.web.HttpMediaTypeNotSupportedEx..

heisely93.tistory.com

 

해결 방법

▶ pom.xml에 dependency 추가하기

<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>form-data</artifactId>
    <version>4.0.0</version>
</dependency>

▶ Controller에서 @RequestBody 제거

Json형식으로 데이터를 받을 때에는 "@RequestBody VO명 변수명" 의 형식으로 받아야 했지만, FormData의 경우 오히려 @RequestBody가 에러를 유발한다. 따라서 해당 어노테이션을 삭제했다.

 


이렇게 작업을 했더니 백단으로 넘어가지 않던 문제가 해결됐다.

이 외에 쿼리 문제도 있어서 수정후에 정상적으로 게시물이 등록되는 것을 확인할 수 있었다.


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형
728x90
반응형

Error

- java.lang.IllegalArgumentException -

500 에러를 곁들인..


원인
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여서 발생한 에러였다.

 

DAO의 메서드명을 복사해서 XML의 id값에 넣어주는 것을 생활화 하자..

 


 

 

 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > Error' 카테고리의 다른 글

[Error] form-data 처리  (0) 2022.04.11
[Error] 죽은 프로세스 삭제(taskkill)  (0) 2022.03.31
[Error] 415 error  (0) 2022.03.28
[Error] No converter found for return value fo type  (0) 2022.03.18
728x90
반응형

Error

- Serveral ports (xxxx, yyyy) required by pmsProject are already in use. -

 

KeyPoint
 - netstat -ano
 - taskkill /f /pid

오전까지 잘 되던 것이 점심먹고 들어오니 서버가 꺼져있고 켜지질 않는다..

꺼진건지 내가 끄고 나간건지 확실하진 않지만.. 어쨌든 다시 서버를 키고 테스트를 해보려는 찰나..

 

7090포트가 죽으면서 pid를 남기고 죽은 거 같다..

종종 일어나는 일이라 정리

 


 

CMD 관리자모드로 실행

윈도우 내 CMD를 입력해 커맨드창을 실행한다.

 

netstat -ano

netstat -ano (띄어쓰기 꼭!)를 입력해 포트넘버가 7090인 것을 찾는다

cf) 포트넘버 7090인 것의 PID를 더블클릭 후 엔터를 누르면 복사가 된다.

 

taskkill /f /pid PID번호

taskkill /f /pid 4916(띄어쓰기 주의)을 실행하면 정상적으로 종료됨을 알 수 있다.

 

서버 재기동

이제 서버를 재기동하면 문제없이 실행되는 것을 볼 수 있다.

 


 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > Error' 카테고리의 다른 글

[Error] form-data 처리  (0) 2022.04.11
[Error] java.lang.IllegalArgumentException  (0) 2022.04.05
[Error] 415 error  (0) 2022.03.28
[Error] No converter found for return value fo type  (0) 2022.03.18
728x90
반응형

Error

- 415 Error & HttpMediaTypeNotSupportedException -

 

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으로 명시해서 보내주면 된다.

axios.post('/pmsProject/users/uptUserData.do', jsonData, {headers : {'Content-Type': 'application/json'}}).then(function(){
    alert('save complete');
    self.getlist();
});

axios.post 부분에 {headers : {'Content-Type' : 'application/json'}}을 추가해고 실행해보니 정상적으로 작동했다.

 


기타

vue에서 axios.post를 하는 방법은 두 가지 방법이 있다.

첫 번째는 위에 적힌 코드처럼 바로 axios.post('url', jsonData, {headers:{}}); 를 하는 방법이고

두 번째는 model js 파일을 하나 만들어서 하는 방법이 있다.

두 번째 방법의 장점은 한 화면에서 등록/수정/삭제 등을 관리하는 스크립트를 한 번에 작성하여 관리의 용이성코드의 간결화가 있다.

 

두 번째 방법의 예시:

// Vue Component
app.model.users.uptUserData(jsonData).then(function(){
    alert('save complete');
    self.getlist();
});
// Vue Model
var app = window.app || {};
app.model = app.model || {};

(function(app){
var users = app.model.users = {};

    // 초기화
    users.initialized = new Promise(function(resolve){
    	resolve(users);
    });

    // 사용자정보 수정
    users.uptUserData = function(data) {
        return axios.post('/pmsProject/users/uptUserData.do', data, {
            headers : {
            'Content-Type' : 'application/json'
            }
        });
    };
})(app);

두 가지 방법 중 어느것을 사용해도 상관없음! 본인이 편한대로 사용하면 될 것 같다.

 

 


참고> 415 error FormData

https://heisely93.tistory.com/38

 

[Error] form-data 처리

Error - maven project form-data 처리 - KeyPoint  - pom.xml dependency 추가  - @RequestBody 삭제 415 error 토이 프로젝트를 진행하면서 vue를 사용하고 있다. 게시물 등록의 경우, 파일이 포함되어있지 않..

heisely93.tistory.com


 

 

 

End.

heisely's 괴발개발 개발일지

728x90
반응형
728x90
반응형

Error

- 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에 추가해주었다.

 

pom.xml에 추가
<!-- JSON을 위한 library -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk14</classifier>
		</dependency>
		
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
		
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.9.9</version>
		</dependency>
		
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.9</version>
		</dependency>
dispatcher-servlet.xml <bean> 추가
<bean id="beanNameResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"/>
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
	<property name="contentType" value="application/json;charset=UTF-8"></property>
</bean>
	
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json;charset=UTF-8</value>
                </list>
                </property>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
        </list>
    </property>
</bean>

 


이렇게 했는데... 

"java.lang.ClassNotFoundException: javax.xml.bind.JAXBException" 에러가 발생했다.

"java.lang.ClassNotFoundException: javax.xml.bind.JAXBException"
JAXB 라이브러리(Java Architecture for XML Binding)가 클래스 경로에 없어서 발생하는 에러

- JAVA11 이상부터 JAVA SE에서 제거되었다.

이를 해결하기 위해 dependency를 추가..

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

 

조치를 다 취하고 HashMap 값이 JSON으로 잘 변환돼서 넘어오는 것까지 확인 됐는데, 자꾸만 화면에 넘어오질 않았다.

기존 코드
getlist : function(){
        const self = this;
        const formData = new FormData();

        formData.append('testNum', self.num);

        axios.post('/pmsProject/users/test.do', formData).then(function(result){
            console.log("#####################");
            console.log('result: ' + result.list);

            self.list = result.list;
        });
}

DB를 돌고 나온 것을 list 변수에 담아주고, HashMap변수로 result를 선언해준 뒤, result.put("list",list)를 했었다.

그래서 단순히 result.list로 불러왔었는데, Object로만 들어온 것을 확인하고, 전에 POST 연습을 할 때 JSON데이터는 result.data에 저장된다는 것이 생각이 나서 result.data.list로 확인해보니 잘 들어와있는 것을 확인했다.

 

수정 코드
getlist : function(){
        const self = this;
        const formData = new FormData();

        formData.append('testNum', self.num);

        axios.post('/pmsProject/users/test.do', formData).then(function(result){
            console.log("#####################");
            console.log('result: ' + result.data.list);

            self.list = result.data.list;
        });
}

 

Vue template

 


결과 화면

왼쪽에서는 DB에 userSn=999인 유저정보의 enterDt가 정상적으로 출력된 것을 확인할 수 있고,

오른쪽에서는 DB에 userSn=123인 유저정보가 없으므로 사용자정보가 없습니다를 출력되는 것을 확인할 수 있다.

 

 

고작 저 enterDt를 불러와 출력하는것 뿐이었는데.. 너무 기나긴 여정이었다..

이제 HashMap을 JSON으로 변환해서 받아올 수 있으니 금방 구축할 수 있겠지,,

 


추가: template 수정 후 화면 확인

 

 

 

 


End.

heisely's 괴발개발 개발일지

728x90
반응형

'Programming > Error' 카테고리의 다른 글

[Error] form-data 처리  (0) 2022.04.11
[Error] java.lang.IllegalArgumentException  (0) 2022.04.05
[Error] 죽은 프로세스 삭제(taskkill)  (0) 2022.03.31
[Error] 415 error  (0) 2022.03.28

+ Recent posts