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