인프런 커뮤니티 질문&답변

sy k님의 프로필 이미지
sy k

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 목록 검색, 취소

주문내역 @GetMapping Parsing error 관련 질문 드립니다

해결된 질문

작성

·

798

2

  • 회원 등록 -> 상품 등록 -> 주문하기 에서 주문 완료시 에러가 발생합니다

  • 에러 메시지는 html 파싱 에러 라고 나오는데, 경로는 이상이 없는것 같아서 질문 드려봅니다

 

OrderController

@Controller
@RequiredArgsConstructor
public class OrderController {

    private final OrderService orderService;
    private final MemberService memberService;
    private final ItemService itemService;

    @GetMapping("/order")
    public String createForm(Model model) {
        List<Member> members = memberService.findMembers();
        List<Item> items = itemService.findItem();

        model.addAttribute("members", members);
        model.addAttribute("items", items);

        return "order/orderForm";
    }

    @PostMapping("/order")
    public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId,
                        @RequestParam("count") int count) {

        orderService.order(memberId, itemId, count);
        return "redirect:/orders";
    }

    @GetMapping("/orders")
    public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model) {
        List<Order> orders = orderService.findOrders(orderSearch);
        model.addAttribute("orders", orders);

        return "order/orderList";
    }
}

 

`html 경로`

계층.png

콘솔 에러 메시지

rg.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/order/orderList.html]")
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:241) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE]
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE]
	at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE]
	at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.15.RELEASE.jar:3.0.15.RELEASE]

브라우져 에러 메시지

브라우저.png

답변 6

3

안녕하세요. sy k님, 공식 서포터즈 OMG입니다.
.

해당 상황은 경험 상 두 가지 중 하나였던 것 같습니다.

1.타임리프 문법 태그 중간에 코드가 줄내림이 되어 파싱에러가 발생하는 경우

<p:th =~

~></p>

=> orderList.html의 여는 태그 닫는태그 쌍이 두 줄로 줄내림되어 있는 경우 한줄로 변경해주세요

ex) 모든 각 태그를 한줄로 <p></p>

2.application.yml에 open session in view 설정이 false로 되어 있는 경우.

두 가지 상황을 확인해주세요 ^^

확인해보시고 결과를 공유해주세요 :)
.
감사합니다.

sy k님의 프로필 이미지
sy k
질문자

orderList.html 줄내림은 없는것 샅습니다.

두 번재로 open session in view 관련 코드가 yml 파일에 들어 있어야 하는걸까요? 현재 이런 코드는 없습니다

application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
#        show_sql: true
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace

 

orderList.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header"/>
<body>
<div class="container">
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <div>
        <div>
            <form th:object="${orderSearch}" class="form-inline">
                <div class="form-group mb-2">
                    <input type="text" th:field="*{memberName}" class="form- control" placeholder="회원명"/>
                </div>
                <div class="form-group mx-sm-1 mb-2">
                    <select th:field="*{orderStatus}" class="form-control">
                        <option value="">주문상태</option>
                        <option th:each="status : ${T(jpabook.jpashop.domain.OrderStatus).values()}"
                                th:value="${status}"
                                th:text="${status}">option
                        </option>
                    </select>
                </div>
                <button type="submit" class="btn btn-primary mb-2">검색</button>
            </form>
        </div>
        <table class="table table-striped">
            <thead>
            <tr>
                <th>#</th>
                <th>회원명</th>
                <th>대표상품 이름</th>
                <th>대표상품 주문가격</th>
                <th>대표상품 주문수량</th>
                <th>상태</th>
                <th>일시</th>
                <th></th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="item : ${orders}">
                <td th:text="${item.id}"></td>
                <td th:text="${item.member.name}"></td>
                <td th:text="${item.orderItems[0].item.name}"></td>
                <td th:text="${item.orderItems[0].orderPrice}"></td>
                <td th:text="${item.orderItems[0].count}"></td>
                <td th:text="${item.status}"></td>
                <td th:text="${item.orderDate}"></td>
                <td>
                    <a th:if="${item.status.name() == 'ORDER'}" href="#"
                       th:href="'javascript:cancel('+${item.id}+')'"
                       class="btn btn-danger">CANCEL</a>
                </td>
            </tr>
            </tbody>
        </table>
    </div>
    <div th:replace="fragments/footer :: footer"/>
</div> <!-- /container -->
</body>
<script>
    function cancel(id) {
        var form = document.createElement("form");
        form.setAttribute("method", "post");
        form.setAttribute("action", "/orders/" + id + "/cancel");
        document.body.appendChild(form);
        form.submit();
}

</script>
</html>

2

안녕하세요. sy k님, 공식 서포터즈 OMG입니다.

src>main>java>com>jpabook

패키지 구조로 인한 문제입니다.

jpabook패키지를 java패키지 하위로 이동시키면 해결됩니다.

감사합니다.

sy k님의 프로필 이미지
sy k
질문자

와... 패키지 문제는 종종 실수하는데 봐도 봐도 모르겠네요
너무 감사합니다!!

크게 어렵게 생각하지 않으셔도 됩니다 ^^

에러 메시지를 분석하다보면 금방 문제 해결 하실 수 있으실꺼에요

2

안녕하세요. 저도 똑같이 orderList.html, 500번, ParseException 문제로 머리를 박다가 해결하게 되어서, 혹시 도움이 될까 올립니다. 저같은 경우 강사님이 올려주신 소스 자료 패키지 구조와 제 것이 달라서 생기는 문제였습니다...

[orderList.html]

<option th:each="status : ${T(jin.jpa.domain.OrderStatus).values()}"

본인 패키지에 누락이 된 폴더가 없는지 확인하시고 바꾸시면 될 것 같습니다. 도움이 됬으면 좋겠습니다.

1

안녕하세요. sy k님, 공식 서포터즈 OMG입니다.

프로젝트 코드를 확인해봐야 알 것 같습니다.


전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

0

sy k님의 프로필 이미지
sy k
질문자

https://drive.google.com/drive/folders/1ReP0Ohc9F-I3G8bDOWndD87mYeiUV97l?usp=sharing

 

[오류 확인]

  • db(H2)에 연결 후 1. 회원 등록 -> 2. 상품 등록 * -> 3.상품 주문상품 주문 후 리다이렉트 화면에서 에러가 발생합니다.

0

안녕하세요, sy k 님! 공식 서포터즈 codesweaver 입니다.

타임리프 파싱 에러로 보이는데요,

orderList.html 상에 타임리프 문법 오류가 있는것 같습니다.

orderList.html 파일 내용을 올려주시거나 한번 다시 검토해 주시기 바랍니다.

감사합니다.

sy k님의 프로필 이미지
sy k

작성한 질문수

질문하기