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

时间:2016-02-01 15:53:25

标签: validation exception grails try-catch throw

我在服务中抛出异常(特别是这些验证)并在控制器中尝试捕获它们。我正在获取数据

在firmController中:

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

在firmService:

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"}我得到了一个N​​umberFormatException。我知道,我可以在控制器中捕获NumberFormatException(或者某种我自己的异常),但是如何获得抛出它的字段/属性(仍然将它作为异常抛出)?

1 个答案:

答案 0 :(得分:1)

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

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