5

I'm very new to JSON/Spring MVC and am trying to get a simple example of an AJAX call to a Spring MVC controller - but I keep returning an error of 400 - Bad Request.

After scouring the Internet, I've found that this is usually caused by not setting the appropriate content type - but [I believe] I have done that.

Here is my AJAX call:

    //validate the object
    var urlString = "/ajax/add/";

    $.ajax({
        type:"POST",
        url: urlString,
        contentType: "application/json; charset=utf-8",
        dataType: "json", 
        data: {value1: 'apples', value2 : 'oranges'},
        success: function(result){
            alert("success");
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert("error:" + textStatus + " exception:" + errorThrown);
        }

    }) ;

And my controller:

@Controller
itpublic class AddController {

private static Logger m_log = null;

@RequestMapping(value = "/ajax/add")
public String handle(@RequestBody String json){

    DummyClass dummyRequest;
    try {

        ObjectMapper mapper = new ObjectMapper();
        dummyRequest = mapper.readValue(json, DummyClass.class);
        m_log.info("Value1: " + dummyRequest.getValue1());
        m_log.info("Value2: " + dummyRequest.getValue2());
    }  catch (Exception e) {

    }
    finally{


    }
    return "called";
}

Can anyone help me out?

edit

Here is my context that I use to configure Spring:

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.project.do" />

<!--<mvc:annotation-driven/> -->

<bean class="com.project.do.interceptors.handler.mapping.HandlerInterceptorAnnotationAwareHandlerMapping "/>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

<bean class="com.project.do.viewresolver.ProjectViewResolver" >
    <property name="tilesResolver" ref="tilesResolver" />
    <property name="jspResolver" ref="jspResolver" />
</bean>

<bean id="tilesResolver" class ="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
    <property name="order" value="2" />
</bean>

<bean id="jspResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="3" />
</bean>

<bean id ="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions" value="/WEB-INF/tiles/tiles.xml" />
    <property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"/>
</bean>

<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/javascript/**" location="/javascript/" />
<mvc:resources mapping="/scripts/**" location="/scripts/" />
<mvc:resources mapping="/styles/**" location="/styles/" />
<mvc:resources mapping="/help/**" location="/help/" />

<!-- <mvc:view-controller path="/" view-name="welcome"/> -->

I should note that I have a working Controller with Ajax in the package com.project.do.working, but the nonworking Controller with Ajax and JSON is in the same package com.project.do.not.working

3
  • How are you configuring Spring? Could you edit the question and add your configuration details (probably an XML file unless you are using the newer @Configuration style). Commented Apr 20, 2012 at 21:38
  • I attached the context used to configure Spring. Thank you! Commented Apr 20, 2012 at 21:50
  • 1
    Can you try replacing your RequestBody with @RequestParam String value1, ..(at)RequestParam String value2? and you do want to have method = RequestMethod.POST inside your ReequestMapping (as mentioned by raddykrish). Commented Apr 21, 2012 at 4:30

2 Answers 2

1

I think your request mapping is not having the RequestMethod as POST. I guess by default it taking it a get request but your AJAX is a POST request. Try changing as below

@RequestMapping(value = "/ajax/add", method = RequestMethod.POST)
public String handle(@RequestBody String json){
}
Sign up to request clarification or add additional context in comments.

2 Comments

I'm selecting this as the answer, as it did appear to be required. I actually had this coded originally, but started stripping out segments when things were not working. The bulk of the problem appeared to be purely environmental in nature - something no one could have helped me out with.
@kjl, I'm facing a similar issue, can you please tell me what the real issue was ? It might help me
0
@Controller
@RequestMapping("/employee/add.htm")
public class EmployeeController {
    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody
    Employee add(HttpServletRequest request, HttpServletResponse response)
            throws Exception {


    }
}

Comments

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.