[Postman/서블렛] Servlet.service() for servlet [requestBodyJsonServlet] in context with path [] threw exception

sbj·2023년 12월 21일
0

ERROR.zip

목록 보기
15/19
post-thumbnail

Problem (문제)

Servlet.service() for servlet [requestBodyJsonServlet] in context with path [] threw exception

Causes (원인)

이 에러는 requestBodyJsonServlet 서블릿이 예외를 던지는 경우 발생한다. 이는 서블릿이 요청을 처리하거나 서블릿에 정의된 서비스 메서드를 실행하는 중에 문제가 발생했음을 나타낸다.

원인은 여러 가지일 수 있지만, 가장 일반적인 원인은 서블릿 코드에 오류가 있거나, 요청이 불완전하거나 잘못된 경우이다.


Solution (해결법)

코드 스니펫

package hello.servlet.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletInputStream inputStream = req.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("messageBody : " + messageBody);

        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

        System.out.println("helloData.username =" + helloData.getUsername());
        System.out.println("helloData.age =" + helloData.getAge());
        resp.getWriter().write("ok");
    }
}

해당 코드를 다시 보면

  1. 요청 본문을 읽어오는 부분: ServletInputStream inputStream = req.getInputStream();String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);에서 요청 본문을 제대로 읽어오지 못하는 경우
  2. JSON 변환: HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);에서 JSON 문자열을 HelloData 객체로 변환하는 과정에서 문제가 발생.
    1. 예를 들어, JSON 문자열이 HelloData 클래스의 형식과 맞지 않는 경우
  3. 응답 작성: resp.getWriter().write("ok");에서 응답을 제대로 작성하지 못하는 경우.
    1. 예를 들어, 클라이언트가 요청한 형식과 다르게 응답하는 경우입니다.

HelloData 클래스 코드 스니펫

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class HelloData {
    private String username;
    private int age;
}

결론

JSON 문자열을 객체로 변환하는 과정에서 문제가 발생했다.

{"username:" "subeen", "age" : 25}

로 수정하였다.


요약

JSON 형식을 지켜 데이터를 전송하자.

오타내지말자.

profile
Strong men believe in cause and effect.

0개의 댓글