В моем приложении MVC 3.1 Spring я думаю, что не могу использовать «< mvc: annotation-driven />». Зачем? Потому что я хочу применить перехватчик к всем сопоставлениям, кроме элементов «< mvc: resources». Поэтому я не могу использовать:Использование области Flash (и RedirectAttributes) без <mvc: annotation-driven /> в Spring 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>
Потому что я не хочу перехватчик обратиться к ресурсам и не существует никакого способа (я думаю), чтобы указать путь для отображения, который будет применяться перехватчик к все, кроме этого и того, что.
Поэтому я должен добавить свой собственный RequestMappingHandlerMapping, чтобы иметь возможность указать на нем перехватчик, а не глобально. Из-за this и this, кажется, я не могу просто определить свой собственную RequestMappingHandlerMapping при сохранении < MVC: аннотация привода /> элемента!
Итак ... С some help, я был в состоянии избавиться от < MVC: аннотация привода /> элемента и почти все хорошо работает в настоящее время. Я использую свой перехватчик во всем, кроме моих ресурсов. Все работает хорошо, кроме флэш-памяти!
@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
}
Карта флэш-памяти NULL, и моя модель не содержит мою переменную. Когда я пытаюсь использовать < mvc: annotation-driven /> элемент работает хорошо! Поэтому мой вопрос: что отсутствует в моем контексте, чтобы сделать работу с флэш-памятью?
Я также попытался установить «org.springframework.web» на уровень ведения журнала DEBUG, а после перенаправления ничего не было связано с FlashMap или FlashMapManager. Кажется, какой-то необходимый компонент определенно отсутствует.
Вот интересные части моего контекста файла:
<!-- 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" />
Чего не хватает для флэш-рамки для работы?
ОБНОВЛЕНИЕ: См. Мой ответ на решение ... На самом деле ничего не было. Только сессия работала неправильно, и я нашел способ заставить ее работать.
В SpringMVC 4.1.x Мне не трудно получить доступ к атрибутам flash непосредственно из 'Model', поскольку указатель Spring указал:« после атрибутов перенаправления из «ввода» FlashMap автоматически добавляются в Модель контроллера, обслуживающего целевой URL ", это правда, что SpringMVC использует сессию для хранения атрибутов вспышки. –