Каковы наилучшие методы настройки глобальных атрибутов модели в Spring MVC?

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 3

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

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>

Ответ 4

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

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

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

Ответ 5

Если вам нужно добавить некоторые глобальные переменные, чтобы каждое представление могло разрешать эти переменные, почему бы не определить их в свойствах или картах, а затем используйте spring DI, обратитесь к видуреверсивному представлению bean. он очень полезен, например, статический, например, 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>