我收到的错误是客户端发送的请求在语法上不正确。做错了什么?这是我的代码:
@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;
}
}
答案 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"})
})