Spring MVC @RequestBody JSON

4

我收到一个错误提示,客户端发送的请求语法有误。是什么出了问题?以下是我的代码:

@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个回答

3
使用以下内容:
$.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服务的更多细节,请查看我的博客


它不起作用,htt6状态415:服务器拒绝此请求,因为请求实体以所请求的方法不支持的格式呈现给所请求的资源。 - Konstantin B.
是的,您需要发送 contentType = application/json,并且必须配置您的Spring应用程序上下文以处理JSON请求...请参见编辑。 - dharam

3

我认为你需要说明服务媒体类型将使用什么来消耗,这样Spring才能知道如何反序列化它。可能是application/json

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

可能还需要一些类似Jackson的Json库。

1

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

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

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();
    }

0

你不需要使用@RequestBody

使用@RequestBody,Spring会调用一个转换器将整个请求转换为所需类型的对象。你发送的数据是application/x-www-form-urlencoded,这是jQuery的默认设置,而且没有内置的转换器。

如果不使用@RequestBody,当你发送表单数据时,Spring会创建一个空对象并根据你发送的数据设置属性。因此,在你的情况下,Spring会执行类似以下操作:

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

我猜这就是你所想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接