Groovy中的类强制转换异常

时间:2009-04-27 16:51:55

标签: grails groovy classcastexception

我想在grails上使用groovy上传图像。 我的gsp页面如下(我正在展示原版的简化版本)

<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>

我的域名类如下:

class Post {    

byte[] myPicture

static mapping = {
    myPicture type:  "blob" 
}

我需要这个映射,否则MySql会创建一个smallblob,小到适合图像

static constraints = {
    myPicture(nullable:false)      
}

}

在控制器上我有一个名为save的动作,如下所示:

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])
    }
}

当我尝试在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无法强制转换为java.sql.Blob

任何暗示为什么会这样?

顺便说一下,我在一个教程中看到过,图像是作为字符串处理的,但它没有用 同样。

3 个答案:

答案 0 :(得分:2)

我在Nabble上发现了一个类似的问题:

http://www.nabble.com/MySQL-and-Blobs-td16116885.html

建议采用两种可能的解决方案:

  • 将blob属性的约束更改为较大的max-size,以阻止它使用“TinyBlob”。
  • 对属性的类型声明使用Hibernate Blob实现而不是byte []。这将要求您将数据流式传输到Blob中,而不是直接分配,但上面的帖子提供了执行此操作的代码。

答案 1 :(得分:2)

您可以尝试在loadPost()方法中使用Spring的MultipartFile吗?

以下是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')
    }
}

我相信您可以直接访问f.bytes

答案 2 :(得分:1)

尝试这种方式:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

    post.myPicture = f.getBytes()
    post.pictureType = f.getContentType()                    


    if(post.save()) {