Каковы лучшие рекомендации по настройке атрибутов глобальной модели в Spring MVC? - PullRequest
15 голосов
/ 11 января 2011

У меня есть меню, которое управляется данными (кэшируется), и это глобальный компонент.Я хочу иметь возможность вставлять пункты меню для каждого запроса, так как каждая страница будет использовать его.Какое место лучше поставить?Я использую аннотации на основе Spring3.Лучшее решение, которое я могу придумать, - это использовать OncePerRequestFilter и добавить его туда или подклассифицировать контроллер, но не уверен, как это сделать с аннотацией @Controller.

Ответы [ 5 ]

13 голосов
/ 11 января 2011

Я могу представить два простых варианта:

Каждый класс @Controller предоставляет данные в виде метода, помеченного @ModelAttribute, например,

@ModelAttribute
public MyData getMyData() {
  ...
}

Это не очень хорошо, если выхотя есть несколько контроллеров.Кроме того, это вызывает раздражающий побочный эффект кодирования myData в URL для каждого перенаправления

. Вместо этого я предлагаю реализовать HandlerInterceptor и таким образом предоставлять данные каждому запросу.Вы не можете использовать любую аннотацию, но лучше так отделить ее от своей бизнес-логики.Это похоже на вашу OncePerRequestFilter идею, но еще более Spring-y.

10 голосов
/ 11 января 2011
7 голосов
/ 26 января 2013

Начиная с Spring 3.2, вы можете использовать @ ControllerAdvice вместо использования @ExceptionHandler, @InitBinder и @ModelAttribute в каждом контроллере.Они будут применяться ко всем bean-компонентам @Controller.

import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public class GlobalBindingInitializer {
  @InitBinder
  public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
  }
}

Если вы начали с кода, сгенерированного Spring Roo, или ограничили комментарии, отсканированные с помощью сканирования компонентов, с помощью include-filter, добавьте необходимый фильтр в webmvc-config.xml

<!-- The controllers are autodetected POJOs labeled with the @Controller annotation. -->
<context:component-scan base-package="com.sensei.encore.maininterface" use-default-filters="false">
  <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
  <!-- ADD THE BELOW LINE -->
  <context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
</context:component-scan>
1 голос
/ 11 января 2011

Я только что нашел ответ на тот же вопрос.Это часть моего поста:

Есть ли способ остановить Spring от добавления справочных данных из методов, помеченных @ModelAttribute, в URL на перенаправлениях?

Вы простонеобходимо установить для переменной атрибутов модели expose значение false в RedirectView.

0 голосов
/ 13 ноября 2014

Если вам нужно добавить некоторые глобальные переменные, чтобы каждое представление могло разрешить эти переменные, почему бы не определить их в свойствах или карте, тогда используйте пружинный DI, обратитесь к компоненту распознавателя представлений.это очень полезно, например static static, например resUrl.

<property name="viewResolvers">
    <list>
        <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView" />
            <property name="attributes" ref="env" />
            <property name="exposeContextBeansAsAttributes" value="false" />
            <property name="prefix" value="${webmvc.view.prefix}" />
            <property name="suffix" value="${webmvc.view.suffix}" />
        </bean>
    </list>
</property>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...