Переменные Bind Path для настраиваемого объекта модели в spring
У меня есть класс, который моделирует мой запрос, что-то вроде
class Venue {
private String city;
private string place;
// Respective getters and setters.
}
И я хочу поддержать URL RESTful, чтобы получить информацию о месте проведения. Поэтому у меня есть метод контроллера, подобный этому.
@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) {
// code
}
Есть ли способ, я могу сказать, что в spring для привязки переменных пути к объекту модели (в данном случае Venue) вместо получения каждого отдельного параметра?
Ответы
Ответ 1
Spring MVC
предлагает возможность привязать параметры запроса и переменные пути к JavaBean, который в вашем случае Venue
.
Например:
@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(Venue venue, Model model) {
// venue object will be automatically populated with city and place
}
Обратите внимание, что для вашего JavaBean должны быть свойства city
и place
.
Для получения дополнительной информации вы можете посмотреть с примеромParamGroup() из spring -projects/spring -mvc-showcase
Ответ 2
В соответствии с документацией Spring, доступной в http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates, автоматическая поддержка предоставляется только простым типам:
Аргумент @PathVariable может быть любого простого типа, такого как int, long, Дата и т.д. Spring автоматически преобразуется в соответствующий тип или бросает исключение TypeMismatchException, если это не удается.
Я не пробовал эту конкретную комбинацию @RequestParam
и Model
, но похоже, что вы можете достичь желаемой реализации, создав пользовательский WebBindingInitializer
, как описано в http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-typeconversion.
Пользовательский класс будет иметь доступ к WebRequest и возвратит объект домена, заполненный данными, извлеченными из этого запроса.
Ответ 3
Вы можете обеспечить реализацию интерфейса HandlerMethodArgumentResolver
. Этот интерфейс в основном используется для разрешения аргументов вашим методам контроллера способами, которые Spring не может (что по сути является тем, что вы пытаетесь сделать). Вы достигаете этого, реализуя эти два метода:
public boolean supportsParameter(MethodParameter mp) {
...
}
public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception {
...
}
Вы можете ввести свою реализацию в контекст Spring с помощью:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
Когда Spring обнаружит параметр, который он не может решить, он вызовет ваш метод supportsParameter()
, чтобы узнать, может ли ваш распознаватель разрешить параметр. Если ваш метод возвращает true, то Spring вызовет ваш метод resolveArgument()
, чтобы фактически разрешить параметр. В этом методе у вас есть доступ к объекту NativeWebRequest, который вы можете использовать для захвата пути за пределами contextPath. (в вашем случае это будет: /venue/{city}/{place}
)
вы можете проанализировать путь запроса и попытаться получить город/место Строки
для заполнения в объекте объекта.