Tutorial :Class cast exception in Groovy


I want to upload an image using a groovy on grails. My gsp page is as follows (I am showing a simplified version of the original)

<g:form controller="post" action="save" enctype="multipart/form-data">                My picture  <input type="file" name="myPicture" />           <g:submitButton name="submit" value="Save"/>  </g:form>  

My domain class is as follows:

class Post {        byte[] myPicture    static mapping = {      myPicture type:  "blob"   }  

I need this mapping otherwise MySql will create a smallblob which is to small to fit the images

static constraints = {      myPicture(nullable:false)        }    }  

At the controller I have an action called save which is as follows:

def save = {                                     def post = loadPost(params.id)        post.properties = params        if(post.save()) {          print "hallo world"                       redirect(action:'list', params:params)      } else {          render(view:'edit', model:[post:post])      }  }  

The exception is thrown when I try to save the image at the DB.

2009-04-27 18:16:07,319 [20806951@qtp0-0] ERROR errors.GrailsExceptionResolver  - java.lang.ClassCastException: [B cannot be cast to java.sql.Blob  

org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.ClassCastException: [B cannot be cast to java.sql.Blob

Any hint why is this?

BTW, I've seen in a tutorial that images were handled as strings but it didn't work as well.


try this way:

  def save = {                                       def post = loadPost(params.id)        def f = request.getFile('myPicture')                     post.myPicture = f.getBytes()      post.pictureType = f.getContentType()                              if(post.save()) {  


I found a similar question on Nabble:


Two possible solutions are suggested:

  • Change the constraints of the blob property to a large max-size, to stop it from using "TinyBlob".
  • Use the Hibernate Blob implementation instead of byte[] for the property's type declaration. This will require you stream data into the Blob, instead of direct assignment, but the post above gives code to do so.


Can you try using Spring's MultipartFile within your loadPost() method?

Here's an example from the docs:

def upload = {      def f = request.getFile('myFile')      if(!f.empty) {        f.transferTo( new File('/some/local/dir/myfile.txt') )        response.sendError(200,'Done');      }          else {         flash.message = 'file cannot be empty'         render(view:'uploadForm')      }  }  

I believe you can access f.bytes directly.

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »