当文件包含在 GSP 表单中时,Grails 不会更新数据对象?

Grails doesn't update data object when a file is included in GSP form?

我是一个 Grails 新手,但在我开始搞乱文件上传之前,我认为我做得很好。我正在尝试将文件上传到 S3 并将文件位置存储在我的数据对象中。

我的问题是我可以很好地上传文件,也可以很好地更新我的数据对象,但出于某些疯狂的原因,我不能同时进行这两项操作!

这是简化的测试代码:

GSP 表格:

<form method="post" url="[resource:fileBundleInstance, action:'test']" enctype="multipart/form-data">
     <input type="file" name="bundle">
     <g:actionSubmit class="save" action="test" value="Test" />
</form>

控制器:

@Transactional
def test(FileBundle fileBundleInstance) {

    def file = request.getFile('bundle')
    println file ? "found " + file.originalFilename : "no file"

    fileBundleInstance.state = "test"   // only works if no file input in form
    redirect (action:'edit', id: fileBundleInstance.id)
}

因此这段代码可以很好地获取文件,但不会更新 FileBundleInstance 的状态。但是,如果我注释掉文件上传表单元素:

        <form method="post" url="[resource:fileBundleInstance, action:'test']" enctype="multipart/form-data">
                <!--input type="file" name="bundle"-->
                <g:actionSubmit class="save" action="test" value="Test" />
        </form>

...突然状态更新好了(当然我没有文件)!

我怀疑我从根本上误解了 GSP 表单在 grails 中的工作方式 - 谁能纠正我的错误?

糟糕...令人尴尬的是这是我的错误:-/.

事实证明,我为我的文件使用的名称 'bundle' 也是我的数据对象中的一个字段的名称。 Grails 抛出数据异常,我没有很好的错误处理(新手,记住 :-))。

当我添加行时:

 fileBundleInstance.save();
        fileBundleInstance.errors.allErrors.each {error ->
            println error.toString()}

我看到了漂亮的闪亮错误 - 如果我将名称从 'bundle' 更改为 'myfile',一切正常。哎呀