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

carpediem7490님의 프로필 이미지

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

상품 상세

NumberFormatException

작성

·

3.8K

0


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
안녕하세요. item.html 타임리프를 적용한 후 상품명을 눌러 실행해보니 아래와 같은 오류가 뜹니다.
 
Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'long'; nested exception is java.lang.NumberFormatException: For input string: "null"]
 
상품명을 눌러서 에러가 났고, NumberFormatExcption이 나와서 BasicItemController에서 {itemId}로 매핑하는 코드를 확인했습니다. 파라미터로 의 값을 'long'으로 받고 있었습니다. 그런데 브라우저 주소를 치니 http://localhost:8080/basic/items/null 'null'이 나왔습니다. 반환타입과 'null'은 서로 맞지 않으니 오류가 난다고 파악했습니다. 그렇다면 반 null값이 안나오게 바꿔줘야하는데 어떻게 해결 해야하는 지 잘 모르겠네요. 도움 요청합니다!
 
 
 
BasicItemController의 코드는 다음과 같습니다.
------------------------
@Controller
@RequestMapping("/basic/items")
@RequiredArgsConstructor
public class BasicItemController {

private final ItemRepository itemRepository;

@GetMapping
public String items(Model model) {
List<Item> items = itemRepository.findAll();
model.addAttribute("items", items);
return "basic/items";
}

@GetMapping("/{itemId}")
public String item(@PathVariable long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
return "basic/item";
}

@PostConstruct
public void init() {
itemRepository.save(new Item("itemA", 10000, 10));
itemRepository.save(new Item("itemB", 20000, 20));
}

]

 

---------------------

상품명에 관한 코드는 다음과 같습니다.

<div>
<label for="itemName">상품명</label>
<input type="text" id="itemName" name="itemName" class="form-control" value="상품A" th:value="${item.itemName}" readonly>
</div>

 

답변 2

2

저도 비슷한 오류가 떠서 계속 코드를 봤거든요!
혹시 basic/items.html 에 상품명을 타임리프로 렌더링 하는 코드에 잘못 적으신 게 아닐까요?

저 같은 경우는 이처럼 적었더니, 같은 넘버 포멧 오류가 떴어요!

<td><a href="item.html" th:href="@{|/basic/items/{item.id}|}"

그래서 다음과 같이 고쳐주었더니 되었습니다 강의를 들으며 코딩하다보니 했던 실수였어요!

<td><a href="item.html" th:href="@{|/basic/items/${item.id}|}"

0

안녕하세요. carpediem7490님, 공식 서포터즈 David입니다.

.
NumberFormatException은 숫자가 아닌 값을 숫자로 변환하려고 할 때 발생하는 예외입니다.

요청하는 주소 itemId(숫자)가 들어와야 할 파라미터 값으로 숫자가 아닌 문자가 들어와서 발생한 문제로 보입니다.

상품명의 link를 만들어줄 때 상품의 id가 숫자가 아닌 null로 들어간 것 같아요.

서버에서 상품의 id가 존재하는지 먼저 체크해주세요.

그리고 타임리프에서 id를 잘 불러오는지 체크해주세요.
.
감사합니다.

carpediem7490님의 프로필 이미지
carpediem7490
질문자

숫자가 들어가야 할 자리에 null이 들어가서 문제가 생긴거군요. 매핑한곳에 null값이 들어갔나 확인해봤는데 첨부된 사진에 보시는 바와 같이 코드에는 이상이 없는것 같습니다...

1. Item 객체에 id가 있는지

2. 상품 목록을 보여주는 html에서 타임리프로 Item 객체의 id를 잘 불러오는지

2가지를 확인하셔야 합니다.