使用@ModelAttribute 获取对象绑定的空值

Getting null value for object bind with @ModelAttribute

使用 - Spring Boot,Thymeleaf

我在控制器 class 下有以下代码:

public class HotelController {
    
    private HotelService hotelService;
    private HotelRepository hotelRepository;
    
    @Autowired
    public HotelController(HotelService hotelService,HotelRepository hotelRepository) {
        this.hotelService = hotelService;
        this.hotelRepository = hotelRepository;
    }
    


    @GetMapping("/index")
    public String searchHotel(Model model) {
        Hotel hotel = new Hotel();
        model.addAttribute("searchObject",hotel);
        model.addAttribute("cityList", hotelRepository.findListOfCities());
        model.addAttribute("hotelList", hotelRepository.findListOfHotels());
        return "search_hotel";
    }
    
    @PostMapping("/availabilityResult")
    public String afterClickingSearch(@ModelAttribute("searchObject") Hotel hotel,Model model) {
        if(hotelService.searchHotelResult(hotel)==null) 
            return "failure_page";
        else {
            model.addAttribute("hotelRoom_TypePriceGST",hotelService.findHotelPriceandRoomType(hotel.getCity(),hotel.getHotel()).split(","));
            model.addAttribute("total", hotelService.findTotal(hotel.getCity(), hotel.getHotel()));
            return "booking_confirmation";
        }
            
    }
    
    @GetMapping("/navUserRegisterPage")
    public String userRegisterPage(Model model){
        User user = new User();
        model.addAttribute("userObj", user);
        return "user_registerForm";
    }
    
    @PostMapping("/reserveUser")
    public String reserveUserHandler(@ModelAttribute("userObj") User user,@ModelAttribute("searchObject") Hotel hotel,Model model) {
        System.out.println(hotel.getHotel());
        System.out.println(user.getGuest_name());
        model.addAttribute("hotelName", hotel.getHotel());
        model.addAttribute("userName", user.getGuest_name());
        return "confirmation_page";
    }
}

我可以在处理程序方法下找到酒店值(usig hotel.getHotel())- public String afterClickingSearch()

但是当我尝试在处理程序方法 -reserveUserHandler() 下查找酒店值(使用 hotel.getHotel())时;我得到 null 作为值。

请帮助我如何在 reserveUserHandler() 方法下检索酒店值。

似乎您在“search_hotel”页面上有一个酒店支持的表格,并且操作转到 afterClickingSearch()。您可以在 afterClickingSearch() 中访问酒店模型属性,因为您正在表单中提交酒店的属性。当您转换到“booking_confirmation”和其他页面时,您传递酒店 ID 以维护状态并不明显。

您有几个选择,其中一些比其他的更优雅。您可以通过请求参数传递酒店的 ID。第二种选择是在所有可以到达 reserveUserHandler() 的表单中包含一个隐藏的酒店 ID,确保每个表单都使用该 ID 进行初始化,并通过 ID 在 reserveUserHandler() 中查找酒店。我不推荐的第三种选择是将 Hotel 或 Hotel id 设置为会话属性。有关会话属性的更多信息,请参阅 this。当您使用会话属性时,您需要警惕多个浏览器选项卡以及如何在每个选项卡中维护唯一状态。