[오류]

이클립스에서 프로젝트를 maven Update project 하니깐 pom.xml에서 아래와 같은 오류가 발생하였다

cvc-elt.1.a:Cannot find the declaration of element 'project'

 

[오류해결]

xsi:schemaLocation 부분에서 https를 http로 수정하니 에러 사라짐

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spring4</groupId>
  <artifactId>testProject01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  
</project>

수정 전

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spring4</groupId>
  <artifactId>testProject01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  
</project>

수정 후

@RequestParam란?

  • 스프링에서 제공하는 HTTP 요청 파라미터 값을 편리하게 사용하게 해주는 어노테이션
  • 파라미터 이름으로 바인딩하는 방법
  • HttpServletRequest의 request.getparameter의 기능과 동일

 

@RequestParam 속성

name

파라미터 이름을 지정하는 것으로 다른 속성이 없을 경우 "name = " 생략 가능

@RequestParam("itemId") Long itemId
@RequestParam(name = "itemId") Long itemId

 

 

required

파라미터의 필수 여부 결정

기본값으로 필수(true)

required가 true 일 경우 해당 파리미터가 없으면 HTTP 상태코드 400반환,

false일 경우 해당 파라미터가 없어도 예외 발생 X

@RequestParam(name = "itemId", required = true) Long itemId
@RequestParam(name = "itemId", required = false) Long itemId

 

주의할점

파라미터의 이름만 있고 값이 없는 경우 (null과 다름) 빈문자로 취급하여 예외 발생 X

 

 

defalutValue

파라미터에 값이 없을 경우 defalutValue 속성을 사용하여 기본값 적용

이경우 기본 값이 설정되기 때문에 required와 함께 사용하면 required 의미가 없음

 

 

@RequestParam 사용법

@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";
}

 - Http 요청 파라미터의 이름으로 바인딩하여 그 값을 변수에 저장

 

<form role="form" action="/order" method="post">
    <div class="form-group">
        <label for="member">주문회원</label>
        <select name="memberId" id="member" class="form-control">
            <option value="">회원선택</option>
            <option th:each="member : ${members}"
                    th:value="${member.id}"
                    th:text="${member.name}" />
        </select>
    </div>
</form>
  • html에서 name으로 받아온다

 

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

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

 * HTTP파라미터 이름이 변수랑 동일할 경우 4 @RequestParam의 value 값 생략 가능

 

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

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

 * String, int, Integer 등 단순 타입일 경우 @RequestParam 생략 가능

[오류]

주문를 할 경우 아래와 같은 오류로  화면이 랜딩되지 않는 오류 발생

 

아래 더 오류를 보니 주문상태 값을 가져오지 못해 발생한 것을 알 수있었다

Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "T(jpabook.jpashop.domain.OrderStatus).values()" (template: "order/orderList" - line 16, col 33)
	at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
	at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
	... 48 more

 

 

 

[오류 원인]

강의에서 html 부분은 복붙하여 사용하여 그대로 나도 복붙해서 사용했는데 경로가 달라서 발생하는 문제였다

복붙을 하더라도 한 번 확인했어야 하는 부분인데 시간을 너무 많이 잡아 먹었다.

여기서 사용한 T연산자는 Thymeleaf의 표현식인데 이렇게 풀경로를 적어서 왜 values() 메소드를 호출했는지 모르겠다.

그래서 T연산자를 사용하지 않고 불러오도록 수정하려고 한다.

 

[코드 수정]

1.컨트롤러에서 모델에 Enum 값 추가

먼저, OrderController 컨트롤러에서 OrderStatus enum의 values() 메소드를 호출하여 모든 enum 값을 가져온 후, 이를 orderList.html 뷰로 전달하기 위해 모델에 추가

model.addAttribute("orderStatuses", OrderStatus.values());

 

 

 

 

2. 컨트롤러에서 모델에 추가된 orderStatuses를 Thymeleaf 템플릿에서 사용하여 옵션을 생성

T연산자사용한 부분을 지우고 아래와 같이 수정해주었다

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

수정 전

status : ${orderStatuses}

 

수정 후

 

3. 정상작동

프로젝트 수행 중 html 복붙을 하였는데 아래와 같은 오류가 발생하였다 

 

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/item/createItemForm.html]") 에러상황

 

TemplateInputException: An error happened during template parsing 에러 내용을 검색해보니 html를 가져오는 중에 깨지는 것이라고 하여

 

[오류 해결 시도]

1.  class간 연결관계에 문제가 있을 수 있으므로, 우선  creatItemform.html에서 복붙했던 코드를 지우고 <body>에 간단한 코드를 작성한뒤 다시 연결해보니 정상출력됨

 

2.복붙한 html에서 쓰는 필드명 오타난거 있나 확인

Bookform.java에서 저자 필드명 오타 확인

 

3. author 관련 코드 모두 수정

 

4.재실행

 

5. 해결

 

html를 복붙하였는데 왜 오류가 발생하는지 이해할 수 없었는데 결국 천천히 관련 코드를 보니 내가 직접 코딩하면서 발생한 오타 때문이였다.

+ Recent posts