2011-01-10 12 views
14

Mam menu, które jest oparte na danych (buforowane) i jest elementem globalnym. Chcę móc wprowadzać elementy menu dla każdego żądania, ponieważ każda strona będzie z niego korzystała. Jakie jest najlepsze miejsce, aby to ująć? Korzystam z adnotacji opartej na Spring3. Najlepsze rozwiązanie, jakie mogę sobie wyobrazić, to użycie OncePerRequestFilter i dodanie go tam lub podklasy kontrolera, ale nie wiem, jak to zrobić z adnotacją @Controller.Jakie są najlepsze praktyki dotyczące ustawiania globalnych atrybutów modelu w Spring MVC?

Odpowiedz

13

mogę myśleć o dwóch łatwych opcji:

Każda klasa @Controller naraża dane jako metoda z dopiskiem @ModelAttribute np

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

To niezbyt miłe, jeśli masz wiele kontrolerów. Ma to również irytujący efekt uboczny kodowania adresu URL dla każdego przekierowania, sugerując zamiast tego implementację i wystawianie danych na każde żądanie w ten sposób. Nie możesz użyć adnotacji-lovin, ale lepiej oddzielić ją od logiki biznesowej w ten sposób. Jest to podobne do twojego pomysłu OncePerRequestFilter, ale o większej ilości Spring-y.

+3

+1 za podanie efektu ubocznego ModelAttribute. Chciałbym, żeby ktoś mi to wcześniej powiedział :(Dzięki za wskazówki –

7

Począwszy od wersji 3.2, można użyć @ControllerAdvice zamiast używać @ExceptionHandler, @InitBinder i @ModelAttribute w każdym kontrolerze. Zostaną one zastosowane do wszystkich komponentów 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)); 
    } 
} 

Gdybyś zaczął się z wiosennym Roo wygenerowany kod, lub ograniczyć adnotacje zeskanowane przez Component-skanować za pomocą zawierać filtr, następnie dodać wymaganą filtr w 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> 
+0

Może być także przydatny link o '@ ControllerAdvice' w' Spring 4': http://blog.codeleak.pl/2013/11/controlleradvice- improvement-in-spring.html – Andremoniy

0

Jeśli potrzebujesz dodać niektóre zmienne globalne, że każdy widok może rozwiązać te zmienne, dlaczego nie zdefiniować właściwości lub mapy ?, a następnie użyć sprężyny DI, zapoznaj się z komponentem bean resolwera widoku. jest bardzo użyteczny, na przykład statyczny, na przykład 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> 
Powiązane problemy