4

I am using Spring MVC on the server side, but in one of the pages I decided to create an AJAX validation with jQuery rather than the default Spring validation. Everything works great, except when I have to do a remote validation to check if a "title" already exists in the database. For the javascript I have the following:

var validator = $("form").validate({
    rules: {
        title: {
            minlength: 6,
            required: true,
            remote: {
                url: location.href.substring(0,location.href.lastIndexOf('/'))+"/checkLocalArticleTitle.do",
                type: "GET"
            }
        },
        html: {
            minlength: 50,
            required: true
        }
    },
    messages: {
        title: {
            required: "A title is required.",
            remote: "This title already exists."
        }
    }

});

Then, I use Spring-Json to make this validation and give a response:

@RequestMapping("/checkLocalArticleTitle.do")
public ModelAndView checkLocalArticleTitle(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    Map model = new HashMap();
    String result = "FALSE";
    try{
        String title = request.getParameter("title");
        if(!EJBRequester.articleExists(title)){
            result = "TRUE";
        }
    }catch(Exception e){
        System.err.println("Exception: " + e.getMessage());
    }
    model.put("result",result);
    return new ModelAndView("jsonView", model);
}

However, this does not work and the field "title" is never validated. I think the reason for this is that I am returning an answer in the manner:

{result:"TRUE"}

when in fact, the answer should be:

{"TRUE"}

I don't know how to return a single response like this one using a ModelAndView answer.

Another thing that is not working is the customized message for the "remote" validation:

    messages: {
        title: {
            required: "A title is required.",
            remote: "This title already exists."
        }
    },

The required message works, but not the remote message. I looked around, but I didn't see many people using Spring and jQuery at the same time. At least, not mixing with jQuery remote valdations and Spring-Json. I would appreciate some help here.

1
  • nobody knows the answer? Commented Apr 11, 2010 at 18:53

2 Answers 2

3

I encountered the same problem with you.

and now I do

@RequestMapping(value = "/brand/check/exists", method = RequestMethod.GET)
public void isBrandNameExists(HttpServletResponse response,
        @RequestParam(value = "name", required = false) String name)
        throws IOException {
    response.getWriter().write(
            String.valueOf(Brand.findBrandsByName(name).getResultList()
                    .isEmpty()));
}

May not be a good solution. But anyway, that works out.

If there is a better way, please let me know :)

Update:

In Spring 3.0 we can use @ResponseBody to do this

@RequestMapping(value = "/brand/exists/name", method = RequestMethod.GET)
@ResponseBody
public boolean isBrandNameExists(HttpServletResponse response,
        @RequestParam String name) throws IOException {
    return Brand.findBrandsByName(name).getResultList().isEmpty();
}
Sign up to request clarification or add additional context in comments.

Comments

1

Here is another example of Spring MVC jQuery remote validation, to check for user uniqueness. Parameter is passed as json and server returns boolean.

Js:

$('#user-form').validate({ // initialize the plugin
    rules: {
        username: {
            required: true,
            remote: function() {  
                var r = {  
                    url: 'service/validateUsernameUnique',  
                    type: "POST",  
                    contentType: "application/json; charset=utf-8",  
                    dataType: "json",  
                    data: '{"username": "' + $( "#username" ).val() + '"}'
                   }   
                return r;  
              }
        },
     },
    messages: {
        username: {
            remote: jQuery.format("User {0} already exists")
        }
    }
});

Spring controller:

@RequestMapping(value="/AdminUserService/validateUsernameUnique", method = RequestMethod.POST)
public @ResponseBody boolean validateUsernameUnique(@RequestBody Object username) {

    @SuppressWarnings("unchecked")
    String name = ((LinkedHashMap<String, String>)username).get("username");
    return userService.validateUsernameUnique(name);
}

1 Comment

I imagine many things have changed in 4 years. I am not using Spring anymore but thank you for your response @tetchen9.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.