Каковы наилучшие методы настройки глобальных атрибутов модели в Spring MVC?
У меня есть меню, которое управляется данными (кэшировано) и является глобальным компонентом. Я хочу иметь возможность вводить пункты меню для каждого запроса, так как каждая страница будет использовать его. Какое лучшее место? Я использую основанную на аннотациях Spring3. Лучшее решение, о котором я могу думать, это использовать параметр OnePerRequestFilter и добавить его там или подклассифицировать контроллер, но не уверен, как это сделать с аннотацией @Controller.
Ответы
Ответ 1
Я могу представить два простых варианта:
Каждый класс @Controller
предоставляет данные как метод, аннотированный с помощью @ModelAttribute
, например
@ModelAttribute
public MyData getMyData() {
...
}
Это не очень приятно, если у вас несколько контроллеров. Кроме того, у этого есть раздражающий побочный эффект кодирования myData
на URL для каждого перенаправления
Я предлагаю вместо этого реализовать HandlerInterceptor
и подвергать данные каждому запросу таким образом. Вы не можете использовать какой-либо аннотации-lovin, но он лучше отделен от вашей бизнес-логики таким образом. Это похоже на вашу идею OncePerRequestFilter
, но но более Spring -y.
Ответ 2
Вы можете реализовать его как HandlerInterceptor
.
См. также:
Ответ 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>