我在服务中抛出异常(特别是这些验证)并在控制器中尝试捕获它们。我正在获取数据
在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"}
我得到了一个NumberFormatException。我知道,我可以在控制器中捕获NumberFormatException(或者某种我自己的异常),但是如何获得抛出它的字段/属性(仍然将它作为异常抛出)?
答案 0 :(得分:1)
使用当前用于初始化域对象的方法,您不能。当grails尝试将String
值asd
转换为BigDecimal
(data.year as BigDecimal
)并且它与ValidationException
无关时,会抛出NFE。
JSONObject
类实现Map
并且在grails中,所有域都有一个接受Map
的构造函数,并且可以使用map属性初始化对象。因此,不是手动绑定每个属性,而是可以使用new Firm(data)
中的firmService
直接实例化对象。这样,当grails尝试将非十进制值绑定到BigDecimal
类型字段时,您将获得绑定异常。