Announcement Announcement Module
No announcement yet.
return a message for binder error. Page Title Module
Move Remove Collapse
Conversation Detail Module
  • Filter
  • Time
  • Show
Clear All
new posts

  • return a message for binder error.

    The following is my code of one controller, if end user input a bad format date, such as : 2008-bad-01, bindingResult.hasErrors() will return true.

    But I want to return a message to end user.
    Do you know any way to get end user's originall input?
    How do I know which date(start or end) is wrong?

    Thanks a lot.

    ================================================== ===
    public class SearchAttendanceCommand {

    private Date start;
    private Date end;

    public class AttendanceController extends MultiActionController {

    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    CustomDateEditor editor = new CustomDateEditor(dateFormat, false);
    binder.registerCustomEditor(Date.class, editor);

    protected BindException bindObject(HttpServletRequest request, Object command) throws Exception {
    ServletRequestDataBinder binder = createBinder(request, command);
    BindingResult bindingResult = binder.getBindingResult();
    if (bindingResult.hasErrors()) {
    //Simple way??????
    return null;

    public ModelAndView view(HttpServletRequest request, HttpServletResponse response) throws Exception {

    SearchAttendanceCommand command = new SearchAttendanceCommand();
    bindObject(request, command);

    ================================================== ===

  • #2
    First off all please use [ code][/code ] tags when posting code.

    Next to that I suggest you read the reference guide about validation, binding and exception resolving. Spring already has infrastructure and integration for it, you don't have to do it yourself.

    Chapter 13 of the reference guide covers all of this.

    Basically from your bindObject method you always want to return the BindingResult, that result you can ask for a model and pass that into your ModelAndView. As a suggestion you might want to take a look at the SimpleFormController.
    Last edited by Marten Deinum; Apr 4th, 2008, 01:38 AM.


    • #3
      Now, I am using AbstractCommandController instead of MultiActionController.
      StationDeleteController does not use SimpleFormController, because the id came from URL link, which created by another controller.

      Normally, stationId will not be -1 or "ddd", but end user can enter anything URL from Firefox navigation bar, such as:


      To make my application more robust, I have my validator class below.

      To display error message, I have error.jsp.

      But spring:hasBindErrors always return false, do you know the reason?

      If I remove <spring:hasBindErrors>,
      http://localhost:8180/arden/df/stati...?stationId=ddd will show:
      Failed to convert property value of type [java.lang.String] to required type [int] for property 'stationId'; nested exception is java.lang.NumberFormatException: For input string: "ddd"

      http://localhost:8180/arden/df/stati...g?stationId=-1 will show:
      station id should not be negative number.

      <bean id="stationDeleteController" class="arden.springmvc.controller.df.StationDeleteController">
              <property name="validator" ref="stationDeleteCommandValidator"/>
              <property name="commandName" value="commandBean"/>
              <property name="commandClass" value="arden.springmvc.command.StationDeleteCommand"/>
      <?xml version="1.0" encoding="UTF-8" ?>
      <%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>
      <%@ taglib uri="" prefix="c"%>
      <%@ taglib uri="" prefix="spring"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
      <html xmlns="">
        <spring:hasBindErrors name="commandBean">
          <c:forEach var="errMsgObj" items="${errors.allErrors}">
            <spring:message code="${errMsgObj.code}" text="${errMsgObj.defaultMessage}"/>
      package arden.springmvc.controller.df;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import org.apache.log4j.Logger;
      import org.springframework.validation.BindException;
      import org.springframework.web.servlet.ModelAndView;
      import org.springframework.web.servlet.mvc.AbstractCommandController;
      import arden.service.Service;
      import arden.springmvc.command.StationDeleteCommand;
      public class StationDeleteController extends AbstractCommandController {
          private final static Logger logger = Logger.getLogger(StationDeleteController.class);
          private Service service;
          public Service getService() {
              return service;
          public void setService(Service service) {
              this.service = service;
          protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object object, BindException errors) throws Exception {
              if (errors.hasErrors()) {
                  logger.error("errors.hasErrors() is true");
                  return new ModelAndView("error", "errors", errors);
              StationDeleteCommand command = (StationDeleteCommand) object;
              return new ModelAndView("df/listStation");
      package arden.springmvc.validator;
      import org.apache.log4j.Logger;
      import org.springframework.validation.Errors;
      import org.springframework.validation.Validator;
      import arden.springmvc.command.StationDeleteCommand;
      public class StationDeleteCommandValidator implements Validator {
          private final static Logger logger = Logger.getLogger(StationDeleteCommandValidator.class);
          public boolean supports(Class clazz) {
              return StationDeleteCommand.class.isAssignableFrom(clazz);
          public void validate(Object object, Errors errors) {
              StationDeleteCommand command = (StationDeleteCommand) object;
              if (command.getStationId() < 0) {
                  logger.error("negative station id[" + command.getStationId() + "]");
                  errors.rejectValue("stationId", "");
      package arden.springmvc.command;
      public class StationDeleteCommand {
          private int stationId;
          public int getStationId() {
              return stationId;
          public void setStationId(int stationId) {
              this.stationId = stationId;


      • #4
        What is happening is that the input from the web to an integer. All the input from the web is a String. 1234 can be converted to an int(eger) ddd cannot be converted to an int. And will cause a bind error. Which is something different then your validation error.

        I suggest you read chapter 13 regarding spring mvc, especially the part about resolving message codes and I18N.