2012-03-31 2 views
4

В моем приложении 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" /> 

Чего не хватает для флэш-рамки для работы?

ОБНОВЛЕНИЕ: См. Мой ответ на решение ... На самом деле ничего не было. Только сессия работала неправильно, и я нашел способ заставить ее работать.

ответ

2

я, наконец, нашел то, что было отсутствует для работы флэш-памяти!

В действии, где я получить доступ к флэш-переменные (на странице редирект приводит к), я должен использовать это:

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

вместо этого:

public String test2(Model model, HttpServletRequest request) 

Кажется, что это позволяет сеансу работать правильно и, следовательно, делает работу флэш-памяти тоже корректной! Зачем? Я не знаю ...

+0

В SpringMVC 4.1.x Мне не трудно получить доступ к атрибутам flash непосредственно из 'Model', поскольку указатель Spring указал:« после атрибутов перенаправления из «ввода» FlashMap автоматически добавляются в Модель контроллера, обслуживающего целевой URL ", это правда, что SpringMVC использует сессию для хранения атрибутов вспышки. –

0

Похоже, все, что вам нужно сделать, это зарегистрировать менеджер флэш-карту с именем бобов flashMapManager и он должен получить автоматически инициализировать и использовать в вашем Dispatcher Servlet:

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

Это ничего не меняет, но благодарит за идею. – electrotype

Смежные вопросы