Подтвердить что ты не робот

Переменные 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) вместо получения каждого отдельного параметра?

4b9b3361

Ответ 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}) вы можете проанализировать путь запроса и попытаться получить город/место Строки  для заполнения в объекте объекта.