Spring MVC @RequestBody JSON



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

@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;
   }

}

使用以下内容:

$.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 服务的更多详细信息,请参阅我的博客

我认为您需要说出 Spring 将消耗的服务媒体类型才能知道如何解组它。大概application/json.

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

可能还有一些Json库,比如杰克逊。

在将JSON数据传递给Spring MVC之前,您必须将其转换为字符串。因此,这是您情况下的解决方案:

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

你不需要@RequestBody .

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

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

display = new Display();
display.setDiagonal("sss");

我想,这就是你想要的。

我不知道

这是否也是你的问题,但对我来说,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();
    }

最新更新