2013-06-17 26 views
21

Tôi có một lớp mô hình yêu cầu của tôi, một cái gì đó giống nhưbiến Đường dẫn Bind đến một đối tượng mô hình tùy chỉnh vào mùa xuân

class Venue { 
    private String city; 
    private string place; 

    // Respective getters and setters. 
} 

Và tôi muốn hỗ trợ một URL RESTful để có được thông tin về một địa điểm. Vì vậy, tôi có phương pháp điều khiển như thế này.

@RequestMapping(value = "/venue/{city}/{place}", method = "GET") 
public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) { 
    // code 
} 

Có cách nào, tôi có thể nói vào mùa xuân để ràng buộc biến đường dẫn của tôi với đối tượng mô hình (trong trường hợp này là Địa điểm) thay vì nhận từng tham số riêng lẻ?

Trả lời

2

Theo tài liệu xuân sẵn tại http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates, hỗ trợ tự động được cung cấp để chỉ các loại đơn giản:

Một lập luận @PathVariable có thể là bất kỳ kiểu đơn giản như int, long, ngày vv mùa xuân tự động chuyển đổi thành loại thích hợp hoặc ném ra một TypeMismatchException nếu nó không làm như vậy.

tôi đã không cố gắng kết hợp cụ thể này của @RequestParamModel, nhưng có vẻ như bạn có thể đạt được thực hiện mong muốn của bạn bằng cách tạo ra một phong tục WebBindingInitializer, được nêu chi tiết tại http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-typeconversion.

Lớp tùy chỉnh sẽ có quyền truy cập vào WebRequest và sẽ trả lại đối tượng miền được điền bằng dữ liệu được trích xuất từ ​​yêu cầu này.

+0

Tôi đoán, điều đó có thể là một chút quá mức cần thiết đối với usecase của tôi. Nhưng cảm ơn đề nghị. –

3

Bạn có thể cung cấp triển khai giao diện HandlerMethodArgumentResolver. Giao diện này chủ yếu được sử dụng để giải quyết các đối số cho các phương thức điều khiển của bạn theo cách mà Spring không thể (mà về bản chất là những gì bạn đang cố gắng làm). Bạn thực hiện điều này bằng cách thực hiện hai phương pháp:

public boolean supportsParameter(MethodParameter mp) { 
    ... 
} 

public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception { 
    ... 
} 

Bạn có thể tiêm thực hiện của bạn vào bối cảnh mùa xuân qua:

<mvc:annotation-driven> 
    <mvc:argument-resolvers> 
     <bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

Khi mùa xuân gặp một tham số nó không thể giải quyết, nó sẽ gọi phương thức của bạn supportsParameter() để xem liệu trình phân giải của bạn có thể giải quyết thông số hay không. Nếu phương thức của bạn trả về true, thì Spring sẽ gọi phương thức resolveArgument() của bạn để thực sự giải quyết tham số. Trong phương thức này, bạn có quyền truy cập vào đối tượng NativeWebRequest, mà bạn có thể sử dụng để lấy đường dẫn ra ngoài contextPath. (trong trường hợp của bạn, nó sẽ là: /venue/{city}/{place}) bạn có thể phân tích cú pháp thông qua đường dẫn yêu cầu và cố gắng để có được thành phố/địa điểm Strings để điền vào Đối tượng địa điểm của bạn.

26

Spring MVC cung cấp khả năng ràng buộc thông số yêu cầu và biến đường dẫn vào JavaBean, trong trường hợp của bạn là Venue. Ví dụ:

@RequestMapping(value = "/venue/{city}/{place}", method = "GET") 
public String getVenueDetails(Venue venue, Model model) { 
    // venue object will be automatically populated with city and place 
} 

Lưu ý rằng JavaBean của bạn phải có cityplace thuộc tính cho nó hoạt động.

Để biết thêm thông tin, bạn có thể xem qua số withParamGroup() example from spring-projects/spring-mvc-showcase

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