Использование области действия Flash (и RedirectAttributes) без <mvc: annotation-driven /> в Spring MVC 3.1 - PullRequest
4 голосов
/ 01 апреля 2012

В моем приложении Spring MVC 3.1 я не могу использовать "". Почему? Потому что я хочу применить перехватчик к всем сопоставлениям, кроме" element!

Итак ... С некоторой помощью я смог избавиться от элемент и почти все теперь работает хорошо.Я применил свой перехватчик ко всему, кроме моих ресурсов.Все работает хорошо, кроме объема вспышки !

@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, и моя модель не содержит мою переменную.Когда я пытаюсь с элемент, он работает хорошо!Итак, мой вопрос: чего не хватает в моем контексте, чтобы заставить работать флеш-область?

Я также пытался установить "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 ]

2 голосов
/ 04 апреля 2012

Я наконец-то нашел, чего не хватает для работы флеш-прицела!

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

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

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

public String test2(Model model, HttpServletRequest request)

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

0 голосов
/ 03 апреля 2012

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

<bean name="flashMapManager" class="org.springframework.web.servlet.support.DefaultFlashMapManager/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...