I am using Play! Framework 2.2 version and I was also facing the same problem.
Since flash is an implicit parameter in the view, I created a new flash object, and passed it. This worked for me. Here is how:
I have created a view clients/new_client.scala.html:
@(clientForm: Form[models.Client])(implicit flash: Flash)
 @flash.get("error").map { errorMessage =>
       <div class="alert-message error">
           <p>
               <strong>Oops!</strong> @errorMessage
           </p>
       </div>
   }
<some/><more/><html/><here/>
And in the Client controller I check if the client entered already exists, then create a flash object and re-render the view.
def add() ....
       val boundForm = clientForm.bindFromRequest
       boundForm.fold(
         // validate rules
         // form has errors
         formWithErrors => {
           log.debug("Form has errors")
           log.debug(formWithErrors.errors.toString)
           Ok(views.html.clients.new_client(formWithErrors)).flashing(
             "error" -> "Form has errors. Please enter correct values.")
         },
         client => {
           // check for duplicate
           log.debug(client.toString)
           models.Clients.get(
client.id)(request.dbSession) match {
             case None =>
               // save
               log.debug("Saving new client")
               models.Clients.insert(client)(request.dbSession)
               // redirect to list
               log.debug("redirecting to client list")
               Redirect(routes.Clients.list)
             case Some(c) => // duplicate
               log.debug("Duplicate client entry")
               val flash = play.api.mvc.Flash(Map("error" -> "Please select another id for this client"))
               Ok(views.html.clients.new_client(boundForm)(flash))
           }
         })
And this works for me in both the cases: Redirect and Ok.
Regards,
Saleem