javadata-bindingspring-mvcvelocityflash-scope

Spring FlashScope


While waiting for FlashScope to be integrated into Spring 3.1 (it's scheduled for this release anyways), I came across this bug posting, which allowed me to incorporate a loose version of what should be available once 3.1 comes out.

My issue is that I seem to be unable to bind to values which are in Flash Scope. So for instance in my model I have the following code:

ModelAndView mav = new ModelAndView(someInjectedRedirectPage);
//Processing
mav.addObject("flashScope.someVar", someObject);

In my UI, using Velocity, I than attempt to bind to this object in the following manner:

##This is a velocimacro for those not familiar with velocity.
##It is basically like setting a path on a field utilizing the
##spring tag lib (e.x. <form:text path="flashScope")

#springBind("flashScope") 

However when I attempt to use that binding, I get the following exception:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'flashScope' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:720)bean name 'flashScope' available as request attribute...

However In my logs, I can clearly state that it's been added to the request. I can also do the following:

$flashScope.someVar.someProperty #The value prints fine this way.

Is there anyway to bind to a Map value (which isn't on a backing command object, but rather just on the request)?

Note if Do the following:

Map<String, String> map = new HashMap <String, String>(); 
map.put("key", "value");
mav.addObject("map", map);

I'm still not able to bind to the map...

Is this behavior I can modify by extending the WebBindingInitializer? Would simply wrapping the FlashScopeMap into another object rectify the problem?


Solution

  • Wrapping into another object has been the only way I've been able to resolve this issue.