일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 친절한 SQL 튜닝
- 반복문
- 산술 연산자
- 예약어
- spring 게시판 삭제
- 오버라이딩
- 친절한 SQL
- join
- 객체지향
- SpringSecurity 로그인
- 논리 연산자
- 인텔리제이 Web 애플리케이션
- SQL 튜닝
- 자바의정석
- 오버로딩
- 식별자
- @PreAuthorize("isAuthenticated()")
- java
- StringBuffer
- 스프링시큐리티 로그아웃
- 연산자
- 객체
- 배열
- 함수
- SQL튜닝
- 상속
- 비교 연산자
- SQL
- SpringSecurity 로그아웃
- 이클립스 설치
Archives
- Today
- Total
gi_dor
JSP에서 LocalDateTime 400에러 문제 본문
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
'First > Error' 카테고리의 다른 글
목록 에서 해당글을 삭제 못하고 첫번째 글을 삭제한다고 ? (0) | 2023.07.29 |
---|---|
Model 값이 안넘어 온다고 ? 오타 , 대소문자 문제... (0) | 2023.07.27 |
Optional int parameter error (0) | 2023.06.24 |
JSP 만으로 브라우저에서 보기 (0) | 2023.06.10 |
TDD - insert 에러java.sql.SQLIntegrityConstraintViolationException: Duplicate entry (0) | 2023.06.09 |