Spring MVC @RequestBody JSON

时间:2013-12-19 16:41:43

标签: json spring

我收到的错误是客户端发送的请求在语法上不正确。做错了什么?这是我的代码:

@Entity
@Table(name = "display")
public class Display  {
   private String diagonal;
   private String aspectRatio;
  //getter and setter
}



  $.ajax({
            type:'POST',
            url:'/admin/updateDisplay',
            data:{'diagonal':"sss"}
        })



@Controller
@RequestMapping(value = "/admin")
public class AdminController {

   @RequestMapping(value = "/updateDisplay", method = RequestMethod.POST)
   public String updateDisplay(@RequestBody Display display){

      System.out.print(display);
      return null;
   }

}

5 个答案:

答案 0 :(得分:3)

我认为您需要说明服务媒体类型将为Spring消耗什么以了解如何解组它。可能是application/json

@RequestMapping(value = "/updateDisplay", method = {RequestMethod.POST}, 
consumes = {"application/json"})

可能还有一些Json图书馆,比如杰克逊。

答案 1 :(得分:2)

使用以下内容:

$.ajax({
        type:'POST',
        url:'/admin/updateDisplay',
        data:{"diagonal":"sss","aspectRatio":"0.5"},
        contentType: 'application/json',
        dataType: 'json',
    })

它有效。

修改

如果您使用注释启动Spring应用程序上下文,那么您的配置类必须具有:

@Override
protected void configureContentNegotiation(
        ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false).favorParameter(true)
            .parameterName("mediaType").ignoreAcceptHeader(true)
            .useJaf(false).defaultContentType(MediaType.APPLICATION_JSON)
            .mediaType("xml", MediaType.APPLICATION_XML)
            .mediaType("json", MediaType.APPLICATION_JSON);
}

您的ajax请求必须包含

contentType: 'application/json',
dataType: 'json',

检查上面修改过的ajax调用。

如果要使用XML启动spring应用程序上下文,请使用以下命令:

<bean id="contentNegotiationManager"
         class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="true" />
    <property name="parameterName" value="mediaType" />
    <property name="ignoreAcceptHeader" value="true"/>
    <property name="useJaf" value="false"/>
    <property name="defaultContentType" value="application/json" />

    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
       </map>
    </property>
</bean>

有关使用Spring 3.2编写RESTFUL Web服务的更多详细信息,请参阅我的blog

答案 2 :(得分:0)

您不需要@RequestBody

使用@RequestBody Spring调用转换器来获取整个请求并将其转换为所需类型的对象。您将数据发送为application/x-www-form-urlencoded,这是jQuery的默认值,并且没有内置转换器。

如果没有@RequestBody,当您发送表单数据时,spring会创建一个空对象,并根据您发送的数据设置属性。所以在你的情况下,Spring会做类似

的事情
display = new Display();
display.setDiagonal("sss");

我想,这就是你想要的。

答案 3 :(得分:0)

我不知道这是否也是您的问题,但对我而言value错误并导致error 405,例如:

@RequestMapping(value = "/planilha/{id}", method = RequestMethod.PUT)
    public String update(@PathVariable("id") String id, @RequestBody String jsonStr) {
        BasicDBObject json = ((BasicDBObject) JSON.parse(jsonStr));
        PlanilhaDAO dao = new PlanilhaDAO();
        BasicDBObject ola = dao.update(id, json);

        return ola.toString();
    }

    @RequestMapping(value = "/planilha/{id}", method = RequestMethod.DELETE)
    public String delete(@PathVariable("id") String id) {
        PlanilhaDAO dao = new PlanilhaDAO();
        BasicDBObject temp = dao.remove(id);

        return temp.toString();
    }

需要改变:

@RequestMapping(value = "/planilha/{id}/**", method = RequestMethod.PUT)
    public String update(@PathVariable("id") String id, @RequestBody String jsonStr) {
        BasicDBObject json = ((BasicDBObject) JSON.parse(jsonStr));
        PlanilhaDAO dao = new PlanilhaDAO();
        BasicDBObject ola = dao.update(id, json);

        return ola.toString();
    }

    @RequestMapping(value = "/planilha/{id}", method = RequestMethod.DELETE)
    public String delete(@PathVariable("id") String id) {
        PlanilhaDAO dao = new PlanilhaDAO();
        BasicDBObject temp = dao.remove(id);

        return temp.toString();
    }

答案 4 :(得分:0)

在将JSON数据传递给Spring MVC之前,必须将其转换为字符串。所以,这是你的案例中的解决方案:

$.ajax({
   type:'POST',
   url:'/admin/updateDisplay',
   data: JSON.stringify({'diagonal':"sss"})
})