2012-03-31 9 views
4

In meiner Spring MVC 3.1-Anwendung kann ich "< mvc: annotation-driven />" nicht verwenden. Warum? Weil ich einen Interzeptor auf alle Zuordnungen außer den Elementen "< mvc: resources" anwenden möchte. So kann ich nicht verwenden:Verwenden des Flash-Bereichs (und RedirectAttributes) ohne <mvc: annotation-driven /> im Frühjahr MVC 3.1

<mvc:annotation-driven /> 

<mvc:resources order="-10" mapping="/public/**" location="/public/" /> 
<mvc:resources order="-10" mapping="/favicon.ico" location="/public/favicon.ico" /> 
<mvc:resources order="-10" mapping="/robots.txt" location="/public/robots.txt" /> 
<mvc:resources order="-10" mapping="/humans.txt" location="/public/humans.txt" /> 

<mvc:interceptors> 
    <mvc:interceptor> 
    <mvc:mapping path="/**"/> 
    <bean class="com.my.Interceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

Weil ich die Abfangjäger auf die Ressourcen nicht gelten soll, und es gibt keinen Weg (glaube ich) einen Weg für die Zuordnung zu spezifizieren, die die Abfangjäger gelten würde alles außer diesem und diesem.

Also muss ich meine eigenen RequestMappingHandlerMapping hinzufügen, um in der Lage sein, den Interceptor auf, und nicht global. Wegen this und this, so scheint es, kann ich nicht einfach mein eigenes RequestMappingHandlerMapping definieren, während die < mvc halten: annotation-driven /> Element!

So ... Mit some help, ich habe in der Lage gewesen, die < mvc loszuwerden: annotation-driven /> Element und so ziemlich alles funktioniert jetzt gut. Ich habe meinen Interceptor auf alles außer auf meine Ressourcen angewendet. Alles funktioniert gut, außer dem Blitzbereich!

@RequestMapping(value="/test", method=RequestMethod.POST) 
public String test(Model model, RedirectAttributes redirectAttrs) 
{ 
    redirectAttrs.addFlashAttribute("myKey", "my message"); 
    return "redirect:test2"; 
} 

@RequestMapping(value="/test2") 
public String test2(Model model, HttpServletRequest request) 
{ 
    Map<String, ?> map = RequestContextUtils.getInputFlashMap(request); // map is NULL 
    System.out.println(model.containsAttribute("myKey")); // Prints FALSE 
} 

Die Flash-Map ist NULL und mein Modell enthält meine Variable nicht. Wenn ich versuche, mit dem < mvc: annotation-driven /> Element funktioniert es gut! Meine Frage ist also: Was fehlt in meinem Kontext, um den Flash-Scope funktionieren zu lassen?

Ich habe auch versucht, "org.springframework.web" auf eine DEBUG-Protokollierungsebene zu setzen, und nach der Umleitung gibt es nichts, das im Zusammenhang mit einer FlashMap oder FlashMapManager protokolliert wurde. Es scheint, dass einige benötigte Bohnen definitiv fehlen.

Hier sind die interessantesten Teile meiner Kontextdatei:

<!-- commented! --> 
<!-- <mvc:annotation-driven /> --> 

<bean id="baseInterceptor" class="com.my.Interceptor" /> 

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="interceptors"> 
     <list> 
      <ref bean="conversionServiceExposingInterceptor" /> 
      <ref bean="baseInterceptor" /> 
     </list> 
    </property> 
</bean> 

<bean id="myRequestMappingHandlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService" /> 
      <property name="validator" ref="validator" /> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 
<bean id="conversionServiceExposingInterceptor" class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor"> 
    <constructor-arg ref="conversionService" /> 
</bean> 

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="classpath:/messages/messages" /> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean> 

<mvc:resources order="-10" mapping="/public/**" location="/public/" /> 
<mvc:resources order="-10" mapping="/favicon.ico" location="/public/favicon.ico" /> 
<mvc:resources order="-10" mapping="/robots.txt" location="/public/robots.txt" /> 
<mvc:resources order="-10" mapping="/humans.txt" location="/public/humans.txt" /> 

Was für den Flash-Rahmen fehlen zu arbeiten?

UPDATE: Siehe meine Antwort für die Lösung ... Nichts hat tatsächlich gefehlt. Nur die Sitzung funktionierte nicht richtig und ich fand einen Weg, es zum Laufen zu bringen.

Antwort

2

fand ich schließlich, was war fehlt für den Flash-Bereich zu arbeiten!

In der Aktion, wo ich die Flash-Variablen zugreifen (auf der Seite der Umleitung führt), habe ich diese verwenden:

public String test2(Model model, HttpServletRequest request, HttpSession session) 

statt dessen:

public String test2(Model model, HttpServletRequest request) 

Es scheint, dass Dies sorgt dafür, dass die Sitzung korrekt funktioniert und der Flash-Bereich somit auch korrekt funktioniert. Warum? Ich weiß nicht ...

+0

In SpringMVC 4.1.x habe ich keine Schwierigkeiten beim Zugriff auf die Flash-Attribute direkt von 'Model', wie Spring doc angezeigt:" Nach den Redirect-Attributen von der "Eingabe" FlashMap automatisch zum Modell der Controller-Portion hinzugefügt Ziel-URL ", stimmt es, dass SpringMVC die Sitzung nutzt, um Flash-Attribute zu speichern. –

0

Es sieht aus wie alle Sie tun müssen, ist ein Flash-Karte-Manager mit einem Bean Namen flashMapManager registrieren und es soll und von Ihrem Dispatcher Servlet verwendete automatisch initialisiert erhalten:

<bean name="flashMapManager" class="org.springframework.web.servlet.support.DefaultFlashMapManager/> 
+0

Das scheint nichts zu ändern, aber danke für die Idee. – electrotype