Grails 如何消除groovy的双重错误

Grails 如何消除groovy的双重错误,grails,groovy,Grails,Groovy,我在try块中对大文件大小进行了验证,在再次抛出该错误并检查静态约束的其他属性的空值以及抛出该错误之后 返回第一个错误后如何停止流 这是密码 static constraints = { applicationName(blank: false, size: 1..25) applicationShortName(blank: false, size: 1..10) applicationImage(nullable: false, maxSize

我在try块中对大文件大小进行了验证,在再次抛出该错误并检查静态约束的其他属性的空值以及抛出该错误之后

返回第一个错误后如何停止流

这是密码

static constraints = {
        applicationName(blank: false, size: 1..25)
        applicationShortName(blank: false, size: 1..10)
        applicationImage(nullable: false, maxSize: MAX_SIZE)
        contentProviderId (
            validator: {
                if (it == 0) {
                    return ['notSelected']
                }
            }
        )
        customErrorMessage (
                validator: {
                    if ("fileToBig".equals(it)) {
                        return ['fileToBig']
                    }
                }
        )
    }

try {
            CommonsMultipartFile file = request.getFile('applicationImageUrl');

            logger.debug("POSTPROCESS: is file empty=${file.isEmpty()}")
            if(!file.isEmpty()) {

                try {


                        -- other logic


                }
                catch (Exception ex) {
                    logger.warn("Failed to upload file - improper file type", ex)
                    return [];
                }

                logger.debug("Getting new image file")
                try {
                    -- logic

                    if (file.size <= MAX_SIZE) {
                        -- logic
                    } else {
                        customErrorMessage = "fileToBig"; ( ERROR FOR BIG FILE SIZE)


                    }
                } catch (Exception e) {
                    logger.warn("Failed to upload file", e)
                    customErrorMessage = "fileToBig";

                }
            } else {
                logger.debug("File was empty. Will check if there is a file in submission")
                if (submission.applicationImage != null && submission.applicationImage != []) {
                    logger.debug("submission contains applicationImage=${submission.applicationImage}")
                    this.applicationImage = submission.applicationImage;
                }
            }
        } catch (Exception e) {
            this.errors.reject("error","An error occured when uploading file. Please try again.");
            logger.error("Failed to upload file", e);
            return [];
        }

        --logic
        if (application != null) { //Application already exists!
            submission.applicationId = application.id;
            return [next: 10];
        }

        return [];
    }
静态约束={
applicationName(空白:false,大小:1..25)
applicationShortName(空白:false,大小:1..10)
applicationImage(可为空:false,最大大小:最大大小)
内容提供者(
验证器:{
如果(it==0){
返回['notSelected']
}
}
)
自定义错误消息(
验证器:{
如果(“fileToBig.equals(it)){
返回['fileToBig']
}
}
)
}
试一试{
CommonsMultipartFile文件=request.getFile('applicationImageUrl');
debug(“后处理:文件为空=${file.isEmpty()}”)
如果(!file.isEmpty()){
试一试{
--其他逻辑
}
捕获(例外情况除外){
logger.warn(“未能上载文件-文件类型不正确”,例如)
返回[];
}
debug(“获取新图像文件”)
试一试{
--逻辑

如果(file.size您可以向applicationImage字段添加自定义验证器,以便仅在customErrorMessage字段不为null时检查null值。 这样,只有当customErrorMessage不为null时,才能在验证异常中获得applicationImage错误

在validator closure中,您可以访问被检查字段的值以及整个对象:

myField(validator: { val, obj -> return propertyName == "myField" })
因此,您可以这样做:

static constraints = {
        applicationName(blank: false, size: 1..25)
        applicationShortName(blank: false, size: 1..10)
        applicationImage(validator: {val, obj ->
            if (obj.customErrorMessage != null) {
                if (val == null) return ['imageNull']
                if (val.size() > MAX_SIZE) return ['tooLarge']
            }
        })
        contentProviderId (
            validator: {
                if (it == 0) {
                    return ['notSelected']
                }
            }
        )
        customErrorMessage (
                validator: {
                    if ("fileToBig".equals(it)) {
                        return ['fileToBig']
                    }
                }
        )
    }

可能需要对错误消息进行调整,但我希望您理解我的观点;)

我不知道有什么方法可以做到这一点。你能解释一下,如果违反了此约束,为什么要停止验证吗?也许我可以建议另一种方法来实现你的目标。请检查编辑的问题…请查看它谢谢提示,但我相信如果customErrorMessage为null,那么我们可以抛出applicationImage错误…a对吗?如何在applicationImage自定义验证程序中访问customErrorMessage?我给出了如下内容…applicationImage(maxSize:MAX_SIZE,验证程序:{if(customErrorMessage==null){return['nullable']})它说没有这样的属性因为它的工作原理…非常感谢..krystian…我将它实现为applicationImage(maxSize:MAX_SIZE,validator:{val,obj->if(obj.customErrorMessage==null){if(val==null)return['null']})对不起krystian,刚刚才知道接受答案…所以回来接受你的答案…再次干杯
applicationImage(maxSize: MAX_SIZE,
            validator: {val, obj ->
            if (obj.customErrorMessage == null) {
                if (val == null) return ['nullable']

            }
        })