기계는 거짓말하지 않는다

Controller Get, Post 오류 본문

Web/Spring Boot

Controller Get, Post 오류

KillinTime 2020. 12. 2. 22:09

아래는 오류 메시지이다.

WARN 29148 --- [io-8080-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]

또는 Request method 'POST' not supported

 

여러가지 이유가 있지만

근본적인 원인은 Controller가 @RestController 라면 @PostMapping 또는 @GetMapping 과

@Controller 라면 @RequestMapping 의 RequestMethod.POST or GET 사용시

HTML의 데이터를 보내는 곳, form 또는 ajax 의 method 와 맞지 않아서 발생한다.

 

다른 이유는 테스트 시 Spring Security 문제이다.

시큐리티 사용 시 권한이 없을 경우 ignoring().antMatchers 에 추가해놓지 않으면

컨트롤러로 데이터를 보낼수가 없다. 분명 잘못 입력한 것이 없어도 말이다.

웹 페이지에서 F12를 눌러 보면 401 에러가 나오는것을 볼 수 있다.

 

하나 더 겪었던 것은 위의 문제도 아닌데 안된다면, 코드 실수가 아니라면

HTML에서 onclick 이벤트로 함수를 정의하고 ajax를 이용했을 경우, form 태그에 이 onclick 을 선언한 태그가

함께 있지 않은지 확인하자. form에 아무것도 적혀있지 않아도, button 이라면 submit이 없더라도

form이 먼저 반응하게 되어 원하는 결과가 나오지 않는 경우가 있다.

또는 <form method='post'> 와 같은 경우도 그렇다. 모달에서 사용하는 경우는 더 알아내기가 힘들다.

 

Test

<body>
	<div>
		<form method="post">
			<div>폼</div>
			<button onclick="return send()">버튼</button>
		</form>
		<div><b id="result">받은 데이터 결과 </b></div>
	</div>
	
	<script>
		function send() {
			$.ajax({
                		type: "POST",
                		url: "/test/sendData",
                		data: {
                    			data: "보낸 데이터"
                		},
                        async: false,
                		success: function(data) {
                			var result = $("#result");
                			result.html(data);
                			return true;
                		},
                		error: function () {
	                		alert("error");
	                		return false;
	            		}
			});
		}
	</script>
</body>

Request method '' not supported

위와 같은 코드는 그냥 페이지가 넘어간다.

 

버튼 클릭 전
버튼 클릭 후

form 밖으로 빼거나 태그를 없애면 된다.

사용해야 한다면 form data를 serialize 하여 보내면 된다. ( $("form").serialize(); )

Comments