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.
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. –