Spring : html form 파라미터와 @ModelAttribute의 바인딩

상우·2025년 1월 9일

상황

바인딩 객체 (@ModelAttribute 붙어있는애)

html 폼 구성

    <form class="form" method="post" action="/coupon-policies/price/book/modify">
                            <input type="hidden" name="_method" value="PUT">
                            <input type="hidden" name="id" th:value= "${pricePolicyForBook.getId()}">
                            <div class="row">
                                <div class="col-12">
                                    <div class="form-group">
                                        <label>정책명<span>*</span></label>
                                        <input name="name" type="text" th:value="${pricePolicyForBook.getName()}">
                                    </div>
                                </div>
                                <div class="col-12">
                                    <div class="form-group">
                                        <label>정책설명<span>*</span></label>
                                        <input name="description" type="text" th:value="${pricePolicyForBook.getDescription()}">
                                    </div>
                                </div>
                                <div class="col-12">
                                    <div class="form-group">
                                        <label>유효기간<span>*</span></label>
                                        <p>시작</p>
                                        <input name="expirationPeriodStart" type="datetime-local" th:value="${pricePolicyForBook.getExpirationPeriodStart()}">
                                        <p>종료</p>
                                        <input name="expirationPeriodEnd" type="datetime-local" th:value="${pricePolicyForBook.getExpirationPeriodEnd()}">
                                    </div>
                                </div>
                                <div class="col-12">
                                    <div class="form-group">
                                        <label>최소주문금액<span>*</span></label>
                                        <input name="minimumOrderAmount" type="text" th:value="${pricePolicyForBook.getMinimumOrderAmount()}">
                                    </div>
                                </div>
                                <div class="col-12">
                                    <div class="form-group">
                                        <label>할인금액<span>*</span></label>
                                        <input name="discountPrice" type="text" th:value="${pricePolicyForBook.getDiscountPrice()}">
                                    </div>
                                </div>
                                <div class="col-12">
                                    <div class="form-group">
                                        <label>적용 도서<span>*</span></label>
                                        <input id="bookIsbn13" name="bookIsbn13" type="text" placeholder="지정할 도서의 ISBN13을 입력해주세요" th:value="${pricePolicyForBook.getBookIsbn13()}">
                                    </div>
                                </div>
                                <div class="col-12">
                                </div>

                                <div class="col-12 pt-5 text-right">
                                    <div class="form-group button col-12">
                                        <button type="submit" class="btn ">정책 수정</button>
                                        <button type="submit" class="btn ">취소</button>
                                    </div>
                                </div>
                            </div>
                        </form>

폼에서 넘어온 정보를 바인딩 객체로 받아오기 위한 컨트롤러

  // 정률정책forBook 수정
    @PutMapping("/coupon-policies/rate/book/modify")
    public String modifyRatePolicyForBook(@ModelAttribute UpdateRatePolicyForBookRequest updateRatePolicyForBookRequest){

        couponPolicyService.updateRatePolicyForBook(updateRatePolicyForBookRequest);
        return "redirect:/coupon-policies/price/book";
    }

문제

html 폼에 입력된 정보들을
컨트롤러에 받아오기 위해 @ModelAttribute 어노테이션을 사용하여
객체로 바인딩 하던 중이었다.

근데 디버깅을 해보니까 얼레 , 모두 안넘어온다

원인과 해결

원인은 기본생성자 어노테이션이었다
@NoArgsConstructor가 있으면
기본생성자를 우선하기 때문에, 기본생성자로 객체를 초기화해주기때문에
null이 뜬다

따라서 @AllArgsConstructor를 사용한뒤, @NoArgsConstrucotor를 제거해주니까 정상적으로 바인딩 되었다

추가로 @Setter를 사용해도 바인딩이 되었다

profile
엉성해도 우직하게

0개의 댓글