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

3두근님의 프로필 이미지
3두근

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

섹션 2 - 셀렉트 박스 강의 내용에서 발생된`MethodArgumentNotValidException` 를 고치지 못하고 있습니다...

해결된 질문

작성

·

241

·

수정됨

1

셀렉트 박스를 만들기 위해 강의에서 추가하는 코드를 저도 추가한 후 동일하게 서버를 띄웠지만,

2023-12-19T09:06:49.880+09:00  WARN 11452 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver :
 Resolved [org.springframework.web.bind.MethodArgumentNotValidException:
 Validation failed for argument [0] in public java.lang.String hello.itemservice.web.form.FormItemController.addItem(hello.itemservice.domain.item.Item,org.springframework.web.servlet.mvc.support.RedirectAttributes):
 [Field error in object 'item' on field 'deliveryCode': rejected value [FAST];
 codes [typeMismatch.item.deliveryCode,typeMismatch.deliveryCode,typeMismatch.hello.itemservice.domain.item.DeliveryCode,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:
 codes [item.deliveryCode,deliveryCode]; arguments []; default message [deliveryCode]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'hello.itemservice.domain.item.DeliveryCode' for property 'deliveryCode'; Cannot convert value of type 'java.lang.String' to required type 'hello.itemservice.domain.item.DeliveryCode' for property 'deliveryCode': 
no matching editors or conversion strategy found]] ]

라고 에러가 뜹니다. 에러 내용대로 고치려면 DeliveryCode 선언할 때 컨버터를 정의해야 하는 것 같은데, 그렇게 코딩한다면 타임리프 기능에서 벗어나는 방식으로 코딩하는 것 같네요..
아래는 제 코드에 추가된 내용들입니다.

  • FormController

@ModelAttribute("deliveryCodes")
public List<DeliveryCode> deliveryCodes() {
    List<DeliveryCode> deliveryCodes = new ArrayList<>();
    deliveryCodes.add(new DeliveryCode("FAST", "빠른 배송"));
    deliveryCodes.add(new DeliveryCode("NORMAL", "일반 배송"));
    deliveryCodes.add(new DeliveryCode("SLOW", "느린 배송"));
    return deliveryCodes;
}
  • addForm.html

     

    <!-- SELECT -->
            <div>
                <div>배송 방식</div>
                <select th:field="*{deliveryCode}" class="form-select">
                    <option value="">==배송 방식 선택==</option>
                    <option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}    "
                            th:text="${deliveryCode.displayName}">FAST</option>
                </select>
            </div>
            <hr class="my-4">

추가된 코드 외에 다른 곳에서부터 에러가 발생되는 것일 수도 있어 프로젝트도 공유해볼게요.
https://drive.google.com/drive/folders/1CrfrMJEdHRJDvrEAMSyDAOr9xLac7I4a?usp=sharing

답변 1

3

안녕하세요. 3두근님, 공식 서포터즈 OMG입니다.

Item클래스의 deliveryCode의 타입을 String으로 변경해서 확인해보시겠어요?

image

감사합니다.

3두근님의 프로필 이미지
3두근
질문자

아... 제가 완전 잘못 오해하고 있었네요.
DeliveryCode 클래스는 컨트롤러와 HTML에서만 사용되고

Item 필드에는 deliveryCode 문자열만 쓰여야 맞겠네요. 이해했습니다.

친절하게 답변해주셔서 너무 감사해요.

 

3두근님의 프로필 이미지
3두근

작성한 질문수

질문하기