Spring

Spring을 사용하여 양식에서 편집되지 않은 개체를 얻는 방법

기록만이살길 2021. 3. 10. 07:12
반응형

Spring을 사용하여 양식에서 편집되지 않은 개체를 얻는 방법

1. 질문(문제점):

애플리케이션에 체크 아웃을위한 간단한 컨트롤러가 있습니다
. 처음에는 주문의 대상인 양식으로 이전합니다.

@GetMapping
    public String getOrderForm(Model model){
        model.addAttribute("orderForm", new OrderDto());
        model.addAttribute("deliveryType", orderService.getDeliveryTypeList());
        model.addAttribute("paymentType", orderService.getPaymentTypeList());
        return "create-order";
    }

그 후 사용자는이 개체의 2 개 필드를 채우고 모두 다음 방법으로 제공됩니다.

    @PostMapping
    public String addNewOrder(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
                              @AuthenticationPrincipal UserDetails currentUser,
                              BindingResult bindingResult,
                              Model model,
                              RedirectAttributes redirectAttributes){
        User userFromBd = userRepository.findByEmail(currentUser.getUsername());
        orderDto.setUser_id(userFromBd.getId());
        List<AddressDto> savedAddress = addressService.getAllSaved(orderDto.getUser_id());
        model.addAttribute("savedAddress", savedAddress);
        model.addAttribute("addressForm", new AddressAdditionDto());
        return "order-address";
    }

여기에서 다른 개체를 양식에 전달하고 사용자가 입력 할 수 있도록합니다. 양식은 다음과 같습니다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Add new order</title>
</head>
<body>
    <div th:each="address : ${savedAddress}">
        <p>
            <span th:text="*{address.country}"></span>
        </p>
        <p>
            <span th:text="*{address.city}"></span>
        </p>
    </div>

    <form th:method="POST" th:action="@{/order/savedaddress}">
        <td>Choose adress:</td>
        <select name="addressId">
            <span th:each="address : ${savedAddress}">
                   <option th:value="${address.id}"
                           th:text="${address.id}"></option>
            </span>
        </select>
        <br>
        <label>
            <input name="submit" type="submit" value="Select"/>
        </label>
    </form>
<p><a href="/">Home</a></p>
</body>
</html>

이 양식에서는 원래 OrderDTO 개체와 상호 작용이 없습니다. 이 양식의 모든 데이터는 다음 방법으로 제공됩니다.

    @PostMapping("/savedaddress")
    public String addAddress(@ModelAttribute("orderForm") @Valid OrderDto orderDto,
                             @RequestParam(value = "addressId", required = false) Long addressId,
                             BindingResult bindingResult,
                             Model model){
        model.addAttribute("orderForm", orderDto);
        if(orderDto.getPaymentType().equals("CARD")) {
            model.addAttribute("savedCard", cardService.getAllByUserId(orderDto.getUser_id()));
            model.addAttribute("cardForm", new CardRegisterDto());
            return "order-card";
        }
        return "order-finish";
    }

그러나 문제는 내 OrderDTO 개체가 이미이 메서드에 완전히 비어 있다는 것입니다. 즉, 이전 양식에 이미 채워진 필드가 비어 있습니다. 무엇과 연결될 수 있습니까?

2. 해결방안:

클래스 위에 @SessionAttributes 어노테이션 (types = {OrderDto.class})을 추가합니다.

65705210
반응형