2015-01-02 16 views
7

Tôi có một lớp đơn giản @Controller mà ám một trang sau khi người dùng đã đăng nhập:Spring MVC làm thế nào để cấm ràng buộc dữ liệu với ModelAttribute?

@Controller 
@SessionAttributes("user") 
public class DashBoardController { 

    @RequestMapping(value="/user/dashBoard", method=RequestMethod.GET) 
    public String showDashBoardPage(@ModelAttribute("user") User user, Model model) { 
     //do some work here.... 
     return "dashBoard"; 
    } 

} 

như bạn thấy, user thuộc tính là đã có trong phiên và bằng cách sử dụng @ModelAttribute chú thích tôi chỉ muốn kéo nó từ đó, không có gì khác. Nhưng nếu bạn thêm bất kỳ tham số nào để yêu cầu, thì spring cố gắng ràng buộc tham số này với đối tượng người dùng hiện tại, đó không phải là những gì tôi muốn, làm thế nào để cấm hành vi này?

Để cụ thể hơn, đây là lớp người dùng:

public class User { 

    private String name; 
    private String password; 
    private Language language; 

    //public getters and setters here... 
} 

Nếu tôi muốn thay đổi ngôn ngữ của trang dashBoard của tôi, tôi yêu cầu trang này với việc bổ sung các ?language=en tham số và trong trường hợp này mùa xuân cố gắng để thay đổi ngôn ngữ trường thuộc tính mô hình người dùng, tất nhiên không thành công với loại ngoại lệ không khớp. Tất nhiên tôi có thể đi bộ xung quanh bằng cách thay đổi tên thông số thành một thứ không khớp với bất kỳ trường nào trong số các trường User, nhưng điều đó có vẻ giống như một giải pháp mong manh. Có cách nào để kiểm soát hành vi ràng buộc dữ liệu này không? Tôi sử dụng Spring 4.1.3

+4

Không sử dụng '@ ModelAttribute' cho rằng ... Nếu nó không được sử dụng cho dữ liệu ràng buộc không sử dụng nó ... Nếu bạn muốn có người dùng đăng nhập bạn nên tích hợp với các công cụ bảo mật thông thường và sử dụng một 'Principal' nếu bạn thực sự muốn sử dụng giải pháp tùy chỉnh của bạn tạo' HandlerMethodArgumentResolver' của riêng bạn mà biết phải làm gì với 'User'. –

+1

Bạn sẽ có thể nhận 'user' qua' model', điều này làm giảm bớt sự cần thiết của '@ModelAttribute (" user ") User user' hoàn toàn. – zeroflagL

+0

Cảm ơn bạn đã bình luận, bây giờ tôi đã quyết định sử dụng ModelMap # get() để kéo người dùng từ phiên làm việc, nhưng sau đó tôi sẽ chuyển sang bảo mật Spring vì nó có ý định xử lý chức năng này. – troy

Trả lời

2

Có một thuộc tính là @ModelAttribute được gọi là binding mà bạn có thể đặt thành false để vô hiệu hóa ràng buộc tham số yêu cầu. Cách sử dụng: @ModelAttribute(binding=false) trước tham số phương thức.

tham khảo: click

Các vấn đề liên quan