Erste HTTP-status 400 - Die Anfrage, die vom client gesendet wurde syntaktisch falsch: mit curl post/put json-Anfrage
Ich arbeite mit spring MVC mit xml - /json-Objekte und ich erhalte folgende Fehlermeldung:
HTTP Status 400 - The request sent by the client was syntactically incorrect ().
Dies ist mein controller.
@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;
}
Ich versuche zu senden, JSON-Objekt mit curl:
curl -v -X PUT -HContent-type:application/json --data '{"id":3,"name":"guest","email":"[email protected]"}' http://localhost:8080/rest/service/emp/1
curl -v -X POST -HContent-type:application/json --data '{"id":3,"name":"guest","email":"[email protected]"}' http://localhost:8080/rest/service/emp
Ich habe Folgendes jackson Abhängigkeiten in der pom-Datei:
<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>
Außerdem habe ich folgende Konfiguration in meinem 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>
Hier ist, wie der Employee-Klasse sieht wie folgt aus:
package com.mkyong.common.bean;
import javax.xml.binden.Anmerkung.XmlRootElement;
@XmlRootElement(name="Mitarbeiter")
public class Mitarbeiter {
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;
}
}
Habe ich die folgenden jar-Dateien in mein 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
Meine BEKOMMEN, funktioniert genauso gut für beide XML-und 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;
}
für folgende curl-Befehl:
curl -HAccept:application/xml http://localhost:8080/rest/service/emp/1
curl -HAccept:application/json http://localhost:8080/rest/service/emp/1
- Können Sie bitte zeigen Sie uns, was Ihre
Employee
Klasse aussieht? - ich habe unten Hinzugefügt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich tatsächlich das Projekt erstellt. Mit eclipse in windows auf tomcat. Ich benutzte Frühjahr 3.2.4 (aber ich glaube nicht, dass es einen Unterschied macht).
Ich hatte das gleiche problem wie du, wenn ich es geschickt falsche json-also ich denke, es ist dein curl-Befehl ist falsch. Bist du auf windows? Wenn ja, müssen Sie escape Ihre Angebote. Ich schickte es die folgenden:
Hinweis: mein controller ist ein bisschen anders ist es hier:
Schreien, wenn das nicht hilft oder Sie wollen keine meiner Dateien.
Ich hatte eine ähnliche Fehlermeldung, wenn ich gebucht, um eine normale http-controller. Mein problem passiert, wenn die Bindung fehlschlägt, wird die Lösung war, dass ich brauchte, um zu zählen BindingResult Ergebnis. Sie könnten versuchen, hinzufügen, dass nach Ihrem Modell für die POST.
Ich bin nicht sicher, ob die syntax der curl, aber mein curl Befehl ist wie folgt und funktioniert für mich (Ihr-H-option, Teil unterschiedlich ist von mir)
curl -v -X PUT -H "Content-Type:application/json" -d '{"id":123, "name":"User123"}' http://localhost:8080/restful/user
Hier ist, wie die Mitarbeiter-Klasse Aussehen
import javax.xml.binden.Anmerkung.XmlRootElement;
@XmlRootElement(name="Mitarbeiter")
public class Mitarbeiter {
}
edit
button unter deiner Frage. Sie brauchen nicht zu veröffentlichen, eine Antwort, fügen Sie einfach den code zu deiner ursprünglichen Frage.Hier mein controller-Methode nach dem hinzufügen BindingResult