본문 바로가기

백엔드/JAVA

[error] 자바 Required String parameter is not present 에러 원인

프론트에서 Restful API 통신작업을 하는 도중 발견한 에러이다.

 

서론

특정 데이터를 삭제하는 기능의 API가 있었다. 해당 API는 delete 메소드로 구현이 되어있었다.

현업에서 특정 상황에서의 요구에 따라 해당 메소드를 Delete에서 Post로 수정하여야 했다.

이 과정에서 발생한 에러이다.

 

예시

Post 메소드 사용을 위해 정상작동하던 API에 매핑 방식을

@DeleteMapping 에서 @PostMapping으로 변경하니 에러가 발생하였다.

 

변경 후 에러가 나는 코드는 다음 상황이다.

@PostMapping("/delete") // 기존 @DeleteMapping

public String testUser (@RequestParam(name = "userId", required = true) String userId)

 

에러 원인

 

테스트를 해보니 @DeleteMapping 이외에 @GetMapping 으로 메소드를 변경했을 경우 매개변수를 잘 받아왔다.

그렇다면 메소드가 Post 일때는 왜 매개변수를 받지 못할까 에 대한 의문이 있었다.

 

일단 결과를 말하자면 Post라고 무조건 @RequestParam를 쓰지 못하는것은 아니다.

에러는 @RequestParam은 기본적으로 url상에서 데이터를 찾기 떄문에 발생하기 때문이다.

 

예를들어 프론트에서 API로 데이터를 던질때 <form> 태그를 이용하여 제출할 경우에는

데이터가 url을 통해 전달되므로, 이 경우에는 Post를 사용해도 @RequestParam로 데이터를 전달받을 수 있다.

 

프론트에서 데이터를 JSON 형태로 주고받을 경우 (나의 경우) 해당 원인으로 인해 에러가 발생하게 된다.

 

 

해결책

1. 수신자쪽 데이터 형식 변경

@RequestParam를 사용하고자 한다면 전송받는 데이터 형식을 JSON 형태로 변경해주면 될것이다.

 

2. 발신자쪽 형식 변경

@RequestBody 로 수신받는 방법이 있다.

@PostMapping("/delete")

public String testUser (@RequestBody HashMap<String, Object> params) {

	String userId = (String) params.get("userId");
    System.out.println("userId : " + userId); // jmoh
}

 

 

 

 

 


 참고링크 : https://ocblog.tistory.com/49