0

I have been trying to create a custom constraint in a Grails Project (see constraint code below).

import org.codehaus.groovy.grails.validation.AbstractConstraint
import org.springframework.validation.Errors

class BuscaConstraint extends AbstractConstraint {

    public static final String CONSTRAINT_NAME = "busca"

    protected void processValidate(Object target, Object propertyValue, Errors errors) {
    }

    boolean supports(Class type) {
      return type && String.class.isAssignableFrom(type);
    }

    String getName() {
      return CONSTRAINT_NAME;
    }
}

As you can see, this constraint doesn't actually validates anything. Instead, it's just a flag to customize the property's rendering in the scaffolding generation. After creating the class above, I added the following line in the file Config.groovy:

ConstrainedProperty.registerNewConstraint(BuscaConstraint.CONSTRAINT_NAME, BuscaConstraint.class)

..and added this constraint to a class's property:

class ThatClass {
  def someProperty
  static constraints = { someProperty (unique:true, busca: "nome") 
}

However, if I try to get the result of the expression ThatClass.constraints.someVariable.getAppliedConstraint("busca"), all I get is null.

I based my approach in some blog posts such as this one and from a constraint in Grails' github repo(however I can't see how they are configured there).

What am I doing wrong? Has the configuration of Grails' custom constraints changed recently?

john
  • 1,156
  • 9
  • 22

2 Answers2

0

It looks your constraint is good. I use something very similar in my Url Without Scheme Validator Plugin, in class UrlWithoutSchemeConstraint and it works like a charm in recent Grails (2.3.x, 2.4.x).

However, I never tried to access it at runtime, so I'd try to investigate this area. For example, have you tried ThatClass.constraints.someProperty.busca?

Marcin Świerczyński
  • 2,302
  • 22
  • 32
  • In grails 4 To access as an example the matches constraint of a domain class it be `ThatClass.constrainedProperties.someProperty.matches` - I think it had been as per answer `constraints` now changed in more recent times to `constraintProperties` – V H May 25 '21 at 18:24
0

I am also using my constraint as a tag in a Grails 2.4.4 project. The constraint can be accessed with the following code:

domainClass.constraints[p.name].getMetaConstraintValue("encodeAsRaw")

Where p.name is the property name and "encodeAsRaw" is the name of my constraint. I am using this code successfully in a couple of .gsp files.

If just using as a tag, you don't even need to create a custom constraint class and register it. It's enough just to check for its existence with the getMetaConstraintValue method.

For completeness, here is my constraint definition in my domain class:

myProperty(nullable:true, blank:true, unique:false, maxSize:1000, encodeAsRaw:true)
Ken
  • 172
  • 7