1

OS: Windows vista, Framework: Spring (latest), JQuery (latest), Hibernate (latest).

I have a domain class with primary key as long id.

public class domain{
    private long id;
    ....
}

My Controller definition:

    @RequestMapping("/domainJqgridData/save")
public @ResponseBody String saveJqgridData(DomainClass domainclass) throws Exception {  
    return "Saved successfully!";
}

When the JSP form is submitted to add a new DomainClass record, the Spring controller tries to automatically bind the request parameters to domain class. It throws a BindException as follows:

Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'domain' on field 'id': rejected value [_empty]; codes [typeMismatch.domainclass.id,typeMismatch.id,typeMismatch.long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [domainclass.id,id]; arguments []; default message [id]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'long' for property 'id'; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "_empty" from type 'java.lang.String' to type 'long'; nested exception is java.lang.NumberFormatException: For input string: "_empty"] org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)

As I am adding a new DomainClass record, the id field is passed as null by the JSP form. Spring converts the null id to empty string value for binding purpose and throws the error. I browsed the net and found that I can register custom editors for such purpose. I changed the DomainClass primitive type definition long id, to Long id and tried to bind a custom editor as follows.

Controller class:
@InitBinder
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Long.class, new CustomPrimitiveFormat(Long.class, true));
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

My custom primitive editor class is as follows:

public class CustomPrimitiveFormat extends CustomNumberEditor{

public CustomPrimitiveFormat(Class numberClass, boolean allowEmpty)
    throws IllegalArgumentException {
    super(numberClass, allowEmpty);
    // TODO Auto-generated constructor stub
}

public void setValue(Object value){
    System.out.println("Entered CustomPrimitiveFormat setValue");
    if (value == null) {
        super.setValue(null);
        return;
    }
    if (value.getClass().equals(String.class)){
        if (StringUtils.isEmpty((String)value)){
            super.setValue(null);
        }
    }
}

public void setAsText(Object value){
    System.out.println("Entered CustomPrimitiveFormat setAsText");
    if (value == null) {
        super.setValue(null);
        return;
    }
    if (value.getClass().equals(String.class)){
        if (StringUtils.isEmpty((String)value)){
            super.setValue(null);
        }
    }
}

}

I still receive the BindingException. Could not find any link that would guide me through how to overcome Spring BindException when adding a new Domain class record. I would like my primary key to remain primitive type, instead of using the Number object type.

Thanks in advance for your help.

skaffman
  • 398,947
  • 96
  • 818
  • 769
Jayaprakash
  • 235
  • 1
  • 7
  • 13

1 Answers1

2

As you can see in the error message, jqGrid uses _empty as an id of the new record (also see here), so you need to change your PropertyEditor to convert _empty to null.

Community
  • 1
  • 1
axtavt
  • 239,438
  • 41
  • 511
  • 482
  • Thanks! a lot for the link. I understand my folly. I overlooked '_' and assumed that it is passing empty value. I renamed the id field in prmNames and spring no longer gives the error. Thanks! again. – Jayaprakash Dec 06 '10 at 23:24