knorv
knorv

Reputation: 50117

Making Grails data-binding interpret empty String values ("") as zero (0)

This question is about altering how the Grails data-binding handles string-to-integer conversion.

Consider the following domain object:

class Foo {
  String name
  Integer price
}

Furthermore, assume that the domain object is populated from HTTP request parameters:

def foo = new Foo(params).save()

The save() method above will fail if params.price == "" (empty string). I'd like to change this behaviour globally so that an empty string is parsed as zero (0) when converting from a string to an integer in Grails data-binding. How do I achieve that?

Upvotes: 0

Views: 1896

Answers (4)

t4w4n3
t4w4n3

Reputation: 11

import org.grails.databinding.BindUsing

class Foo {
  String name

  @BindUsing({ obj, source ->
    source["price"] ?: 0
  })
  Integer price
}

Upvotes: 0

Aaron Saunders
Aaron Saunders

Reputation: 33345

try this constraint instead

static constraints = {
    price(validator: {val, obj ->
        if (val == '' || val == 0) {
            obj.price = 0
            return true
        } else if (val < 1) {
            return false;
        }
    })
}

Upvotes: 0

Aaron Saunders
Aaron Saunders

Reputation: 33345

added a filter see the setion 5.5.1 Events and Auto Timestamping in the grails documentation (http://grails.org/doc/1.1.x/index.html)

   def beforeInsert = {
       if (price == '') { price = 0}
   }

Upvotes: 2

Jared
Jared

Reputation: 39887

Instead of changing the data binding why not just write your own setter? In the setter test to see if the string is empty, if it is set price to 0. If it isn't do a normal integer conversion.

Upvotes: 0

Related Questions