我正在使用带有xml / json对象的spring MVC,我收到了以下错误:
HTTP Status 400 - The request sent by the client was syntactically incorrect ().
这是我的控制器。
@RequestMapping(method=RequestMethod.POST, value="/emp")
public @ResponseBody EmployeeList addEmp(@RequestBody Employee e) {
employeeDS.add(e);
List<Employee> employees = employeeDS.getAll();
EmployeeList list = new EmployeeList(employees);
return list;
}
@RequestMapping(method=RequestMethod.PUT, value="/emp/{id}")
public @ResponseBody EmployeeList updateEmp(@RequestBody Employee e, @PathVariable String id) {
employeeDS.update(e);
List<Employee> employees = employeeDS.getAll();
EmployeeList list = new EmployeeList(employees);
return list;
}
我正在尝试使用curl发送JSON对象:
curl -v -X PUT -HContent-type:application/json --data '{"id":3,"name":"guest","email":"guest@ibm.com"}' http://localhost:8080/rest/service/emp/1
curl -v -X POST -HContent-type:application/json --data '{"id":3,"name":"guest","email":"guest@ibm.com"}' http://localhost:8080/rest/service/emp
我在pom文件中添加了以下jackson依赖项:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.12</version>
</dependency>
我还在servlet-dispatcher.xml中添加了以下配置:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml"/>
<entry key="json" value="application/json" />
<!--entry key="html" value="text/html"/-->
</map>
</property>
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
</bean>
<!-- JAXB XML View -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.mkyong.common.bean.Employee</value>
<value>com.mkyong.common.bean.EmployeeList</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="false" />
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="marshallingConverter" />
<ref bean="jsonConverter" />
</list>
</property>
</bean>
<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="jaxbMarshaller" />
<property name="unmarshaller" ref="jaxbMarshaller" />
<property name="supportedMediaTypes" value="application/xml"/>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>
以下是Employee类的外观:
package com.mkyong.common.bean;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(名称= “雇员”) 公共级员工{
private long id;
private String name;
private String email;
public Employee() {}
public Employee(long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
我的lib中有以下罐子:
aopalliance-1.0.jar
aspectjrt-1.5.3.jar
aspectjweaver-1.5.3.jar
axiom-api-1.2.7.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
jackson-core-asl-1.9.13.jar
jackson-jaxrs-1.9.12.jar
jackson-mapper-asl-1.9.13.jar
jaxb-api-2.1.jar
jaxb-impl-2.2.jar
joda-time-1.6.2.jar
opensaml-2.5.1-1.jar
openws-1.4.2-1.jar
slf4j-api-1.7.2.jar
spring-aop-3.1.3.RELEASE.jar
spring-beans-3.2.2.RELEASE.jar
spring-context-3.2.2.RELEASE.jar
spring-context-support-3.1.3.RELEASE.jar
spring-core-3.2.2.RELEASE.jar
spring-expression-3.2.2.RELEASE.jar
spring-jdbc-3.2.2.RELEASE.jar
spring-oxm-3.2.2.RELEASE.jar
spring-security-config-3.1.3.RELEASE.jar
spring-security-core-3.1.3.RELEASE.jar
spring-security-web-3.1.3.RELEASE.jar
spring-tx-3.1.3.RELEASE.jar
spring-web-3.2.2.RELEASE.jar
spring-webmvc-3.1.3.RELEASE.jar
spring-ws-core-2.1.2.RELEASE.jar
spring-ws-security-2.1.2.RELEASE.jar
spring-xml-2.1.2.RELEASE.jar
stax-api-1.0-2.jar
wsdl4j-1.6.1.jar
wss4j-1.6.5.jar
xmlsec-1.5.1.jar
xmlsec-2.0.jar
xmltooling-1.3.2-1.jar
xws-security-1.3.1.jar
我的GET适用于XML和JSON:
@RequestMapping(method=RequestMethod.GET, value="/emp/{id}", headers="Accept=application/xml, application/json")
public @ResponseBody Employee getEmp(@PathVariable String id) {
Employee e = employeeDS.get(Long.parseLong(id));
return e;
}
用于跟随curl命令:
curl -HAccept:application/xml http://localhost:8080/rest/service/emp/1
curl -HAccept:application/json http://localhost:8080/rest/service/emp/1
答案 0 :(得分:4)
我实际创建了你的项目。在tomcat上使用windows中的eclipse。我使用了弹簧3.2.4(但我认为它没有区别)。
当我发送错误的json时遇到了同样的问题所以我认为这是你的curl命令是错误的。你在窗户吗?如果是这样,你必须逃避你的报价。我发了以下信息:
C:\> curl -v -X POST -HContent-type:application/json -d "{\"id\":3,\"name\":\"guest\",\"email\":\"guest@ibm.com\"}" http://localhost:8080/HelperSpringMVC/emp
* Adding handle: conn: 0x6a3400
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x6a3400) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 8080 (#0)
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /HelperSpringMVC/emp HTTP/1.1
> User-Agent: curl/7.32.0
> Host: localhost:8080
> Accept: */*
> Content-type:application/json
> Content-Length: 47
>
* upload completely sent off: 47 out of 47 bytes
< HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Wed, 11 Sep 2013 21:07:47 GMT
<
[{"id":10,"name":"john","email":"email"},{"id":3,"name":"guest","email":"guest@ibm.com"}]
* Connection #0 to host localhost left intact
注意我的控制器在这里有点不同:
@Controller
public class controller {
@RequestMapping(method=RequestMethod.POST, value="/emp")
public @ResponseBody List<Employee> addEmp(@RequestBody Employee e, BindingResult results) {
if (results.hasErrors()) {
return new ArrayList<Employee>();
}
List<Employee> list = new ArrayList<Employee>();
list.add(new Employee(10, "john", "email"));
list.add(e);
return list;
}
....
如果这没有用,或者您想要我的任何文件,请大声喊。
答案 1 :(得分:3)
当我发布到普通的http控制器时,我遇到了类似的错误。我的问题发生在绑定失败时,解决方案是我需要包含BindingResult结果。您可以尝试在POST模型之后添加它。
答案 2 :(得分:0)
我不确定它是否是curl的语法,但我的curl命令如下并适用于我(你的-H选项部分与我的不同)
curl -v -X PUT -H "Content-Type:application/json" -d '{"id":123, "name":"User123"}' http://localhost:8080/restful/user
答案 3 :(得分:0)
以下是Employee类的外观
package com.mkyong.common.bean;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(名称= “雇员”) 公共级员工{
private long id;
private String name;
private String email;
public Employee() {}
public Employee(long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
答案 4 :(得分:0)
添加BindingResult后,这是我的控制器方法
@RequestMapping(method=RequestMethod.PUT, value="/emp/{id}")
public @ResponseBody EmployeeList updateEmp(@RequestBody Employee e, @PathVariable String id, BindingResult result) {
if(result.hasErrors()) {
System.out.println("Error ::: " +result.toString());
}
employeeDS.update(e);
List<Employee> employees = employeeDS.getAll();
EmployeeList list = new EmployeeList(employees);
return list;
}