[Spring] method parameter type long is not present

김준영·2023년 10월 6일
0
post-thumbnail

RequestParam으로 값을 가져올 때 @RequestParam(value) 값이랑 thymleaf 의 name 값이랑 동일 해야값을 받아올 수 있는데 다르게 했기때문에 다른 코드에서 값이 없다고 저런 에러를 계속 냈다.

접근방법

//타임리프
<div class="form-group">
        <label for="category">카테고리</label>
        <select name="category" id="category" class="form-control">
            <option value="">카테고리 선택</option>
            <option th:each="category : ${categoryNames}"  th:value="${category.id}"
                    th:text="${category.categoryName}" >    </option>

        </select>
    </div>
@PostMapping("/add")
    public String itemPost( @ModelAttribute("form") ItemForm itemForm,
                           @RequestParam("categoryId") Long categoryId)
  • categoryId 로 넘어오는 타입이 Long이 아닌가 생각했다.
  1. ${category.id} → ${category.categoryName} 으로 바꾸고 Long → String 으로 바꿨다.
    • 똑같이 발생
  2. 혹시 Null 값이 들어오는게 아닌지해서 @RequestParam(defaultValue = false) 로 잡아서
    categoryId log를 찍어봤다. → null 값 출력
@GetMapping("/add")
    public String ItemAdd(@ModelAttribute("form") ItemForm itemForm, Model model){

        List<Category> allCategory = categoryService.findAllCategory();

        log.info(allCategory.get(0).getCategoryName());

        model.addAttribute("categoryNames", allCategory);

        return "/buy/new";
    }
  1. GetMapping에서 등록된 카테고리를 List로 View 에 넘겨주고 있다. 여기서 보내주는 값이 Null인가 ?
    1. 그럴 수가 없는게 category1, category2 값들은 잘 출력된다.
  2. 결국 Post 시 문제가 있다는 걸 확신했다.

어떻게 해결하려고 노력했나 ?

  • RequestParam 쪽에 해당되는 categoryId만 값이 안나온다는 걸 확인했다.

@Getter
@Setter
public class ItemForm {

    @NotEmpty
    private String itemName;

    @Range(min = 1000 , max = 200000)
    private int price;

    @Range(min = 1 , max = 200)
    private int stackQuantity;

		
-> 추가
		private Long categoryId;

    public ItemForm() {
    }

    public ItemForm(String itemName, int price, int stackQuantity) {
        this.itemName = itemName;
        this.price = price;
        this.stackQuantity = stackQuantity;
    }
}

categoryId 를 ItemForm의 인스턴스 변수로 추가하여 값을 받아보기로 했다.

//타임리프
<div class="form-group">
        <label for="categoryId">카테고리</label>
        <select name="categoryId" id="categoryId" class="form-control">
            <option value="">카테고리 선택</option>
            <option th:each="category : ${categoryNames}"  th:value="${category.id}"
                    th:text="${category.categoryName}" >    </option>

        </select>
    </div>
  1. 이렇게 타임리프토 수정하고 나서 로그를 찍어보니 값이 제대로 출력되는 걸 확인할 수 있었다.

  2. 그럼.. RequestParam에서 문제인데..
    a. 구글링 해서 찾아보니 RequestParam으로 값을 가져올 때 @RequestParam(value) 값이랑 thymleaf 의 name 값이랑 동일 해야된다는 걸 알 수 있었다.

엄청 기본적인 것을 이해 못하고 있었다.

타임리프와 기본적인 MVC 어노테이션을 공부하자

profile
한전 퇴사 후 독일가기 위한 기록

0개의 댓글