【问题标题】:Class cast exception in GroovyGroovy 中的类转换异常
【发布时间】:2009-04-27 16:51:55
【问题描述】:

我想在 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])
    }
}

当我尝试将图像保存到数据库时引发异常。

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

任何提示这是为什么?

顺便说一句,我在教程中看到图像被处理为字符串,但它不起作用 也是。

【问题讨论】:

  • 你的 loadPost() 方法是做什么的?
  • 没什么特别的 private loadPost(id) { def post = new Post(); if(id) { post = Post.get(id) } 返回帖子 }
  • @Miguel Ping 提供了一段代码,该代码对于上传是正确的,但不能解决 Class Cast Exception。为了“保存”图像,必须使用 getBytes() 方法

标签: grails groovy classcastexception


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。这是类转换异常的解决方案
【解决方案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

【讨论】:

  • 感谢您的建议。应该使用 getBytes()。无论如何,这并不能解决 ClassCastException。要解决此问题,请参阅@Bill James 回答
  • 附带说明,我认为 f.bytes 等同于 f.getBytes(),因为 groovy 将属性访问分配给 getter。
  • 再次感谢。我会测试它。我以为我已经尝试过了,但我遇到了一个例外。让我们看看。
【解决方案3】:

试试这个方法:

  def save = {                               

    def post = loadPost(params.id)

    def f = request.getFile('myPicture')             

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


    if(post.save()) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2021-02-02
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多