导致它的带有字段的 Grails NumberFormatException 或 GroovyCastException

Grails NumberFormatException or GroovyCastException with fields, that cause it

我在服务中抛出异常(尤其是这些验证异常)并在控制器中尝试捕获它们。我正在向

获取数据

在公司控制器中:

try{
    def data = request.JSON
    firmService.createAndSave(data)
}
catch(ValidationException exception){
}

在公司服务中:

def createAndSave(data){
    firm.year = data.year as BigDecimal
    firm.price = data.price as Float
    firm.employees = data.employees as Integer
    firm.name = data.name
    if(!firm.validate()){
        throw new ValidationException(null, firm.errors)
    }
    firm.save(flush:true)
    firm
}

但是如果我发送带有无效数据的 JSON:{year:"asd", price: "fgh", employees: "3", name: "zxc"} 我得到一个 NumberFormatException。我知道,我可以在控制器中捕获 NumberFormatException(或我自己的某种异常),但是我怎样才能得到它被抛出的 fields/properties(并且仍然将其作为异常抛出)?

您不能使用当前用于初始化域对象的方法。当 grails 尝试将 Stringasd 转换为 BigDecimal (data.year as BigDecimal) 并且它与 ValidationException.[=21 无关时,将抛出 NFE =]

JSONObject class 实现了 Map 并且在 grails 中,所有域都有一个接受 Map 的构造函数,并且可以使用映射属性初始化对象。因此,无需手动绑定每个 属性,您可以使用 firmService 中的 new Firm(data) 直接实例化对象。通过这种方式,当 grails 尝试将非十进制值绑定到 BigDecimal 类型字段时,您将获得绑定异常。