gi_dor

JSP에서 LocalDateTime 400에러 문제 본문

First/Error

JSP에서 LocalDateTime 400에러 문제

기돌 2023. 7. 23. 16:02
728x90

400에러 

400 Bad Request 응답 상태 코드는 서버가 클라이언트 오류
(예: 잘못된 요청 구문, 유효하지 않은 요청 메시지 프레이밍, 또는 변조된 요청 라우팅) 를
감지해 요청을 처리할 수 없거나,  하지 않는다는 것을 의미

 

프로젝트 관리자 공지사항 게시판 작성중 날짜 설정 때문에 알게 된건데 
Date, LocalDate, LocalDateTime 모두 날짜와 시간을 표현하기 위한 클래스라고 한다

게다가  LocalDate, LocalDateTime 은 Java8 이후 도입되었다 하여 바로 LocalDateTime사용

 

LocalDateTime인 타입을 JSP에서 el로 출력했더니 날짜와 시간 사이에 ‘T’라는 문자열이 껴서 출력이 되었다. 찾아보니 LocalDateTime은 날짜와 시간을 T 문자로 구분한다고 한다. 

"2023-07-23 'T' 16:48:22.123"

 

이런 형식이 마음에 들지 않아서 다른 방법을 찾아보았더니 인강에

jstl의 <fmt:formatDate> 태그를 사용해서 날짜와 시간의 형식을 지정할 수 있는 방법이 존재했다.

<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>


<c:choose>
        <c:when test="${noticeDTO.regDttm.time >= startOfToday}">
            <td><fmt:formatDate value="${noticeDTO.regDttm}" pattern="HH:mm" type="time"/></td>
        </c:when>

        <c:otherwise>
            <td><fmt:formatDate value="${noticeDTO.regDttm}" pattern="yyyy-MM-dd" type="date"/></td>
        </c:otherwise>
</c:choose>

<span><fmt:formatDate value="${noticeDTO.regDttm}" pattern="yyyy-MM-dd" /></span>

 

바로 그냥 에러가 발생했다 ... 왜!


검색 검색 또 검색...
원인을 찾아보니 <fmt:formatDate> 태그는 java.util.Date 인스턴스만 formatting 가능하다고 한다. 그런데 나는 LocalDateTime 인스턴스를 주어서 에러가 발생한 것이다.

그러면 Date 타입 쓰면되잖아 - 이때 말했어야 했는데...

 


해결방법 

el에서 메서드를 호출할 수 있다고 해서 LocalDateTime을 문자열로 변환해보라고함
뭔 말인지 몰라서 검색함 

 

무슨 포맷 라이브러리를 쓰면된다고 하길래 


알아봤더니 단순히 이거 뿐만아니라 컨트롤러에서도 추가할것들이 있다.

LocalDateTime now = LocalDateTime.now();
ZonedDateTime zdt = now.atZone(ZoneId.systemDefault());
Date date = Date.from(zdt.toInstant());
model.addAttribute("myDate", date);



<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<p>Current date and time: <fmt:formatDate value="${myDate}" pattern="yyyy-MM-dd HH:mm:ss" /></p>

 Instant startOfToday = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant();
m.addAttribute("startOfToday", startOfToday.toEpochMilli());
${noticeDTO.regDttm.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))}

 

결과

23-Jul-2023 15:06:00.109 심각 [http-nio-8080-exec-61] org.apache.catalina.core.ApplicationDispatcher.invoke 서블릿 [jsp]을(를) 위한 Servlet.service() 호출이 예외를 발생시켰습니다.
	java.lang.NullPointerException: formatter
		at java.base/java.util.Objects.requireNonNull(Objects.java:246)
		at java.base/java.time.LocalDateTime.format(LocalDateTime.java:1751)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at javax.el.BeanELResolver.invoke(BeanELResolver.java:159)
		at org.apache.jasper.el.JasperELResolver.invoke(JasperELResolver.java:162)
		at org.apache.el.parser.AstValue.getValue(AstValue.java:158)
		at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
		at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:692)
		at org.apache.jsp.WEB_002dINF.views.fos.cs.mypage.orderDetail_jsp._jspService(orderDetail_jsp.java:326)
		at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
		at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
		at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
		at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
		at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)

 ▶ 뭐 대충 , 심각하고 객체가 null 이라고 에러가 발생함


해결방법

 현재 프로젝트에서는 일자를 LocalDate, 시간을 LocalTime, 일시를 LocalDateTime으로 정의했기 때문에 fmt:formatDate 사용이 불가능

현재 JSP를 사용하는 상황에서는 컨트롤러에서 날짜를 문자열로 변환해서 Model 객체에 넣는 방법밖에 없다고함

LocalDateTime 신상 말고 구형 Date 쓰자고 제시함

일시를 LocalDateTime에서 Date로 변경하고 <fmt:formatDate> 태그를 사용하기로 결정했다.

 

 

 

728x90