affichage de xml à un ressort, le point de terminaison REST n'est pas prise en unmarshalled dans les objet Java
J'ai un projet où xsd sont donnés. J'utilise le xjc compilateur pour générer les classes Java. Et puis j'ai annoter la classe avec XmlRootElement attribut. J'ai configuré le sevlet avec le Jaxb2 marshalling/unmarshalling haricot dans le AnnotationMethodHandlerAdapter. lorsque j'envoie un fichier xml, sans les espaces de noms, j'ai l'415 erreur.
Le code source est comme suit
fichier - web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Test</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
fichier - dispatcher-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"
xmlns:oxm="http://www.springframework.org/schema/oxm">
<context:component-scan base-package="com.test.endpoints" />
<tx:annotation-driven />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="marshallingHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="marshallingHttpMessageConverter"
class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<constructor-arg ref="jaxb2Marshaller" />
</bean>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.test.users.User</value>
<value>com.test.users.Users</value>
</list>
</property>
</bean>
<!-- Should be defined last! -->
<!-- <mvc:annotation-driven />-->
</beans>
fichier de l'utilisateur.xsd
<element name="users">
<complexType>
<sequence>
<element name="user" type="tns:user" minOccurs="0"
maxOccurs="unbounded" />
</sequence>
</complexType>
</element>
<complexType name="user">
<sequence>
<element name="id" type="int" />
<element name="email" type="string"></element>
<element name="first_name" type="string"></element>
<element name="last_name" type="string"></element>
</sequence>
</complexType>
</schema>
Utilisé cette commande pour générer les classes Java pour le dessus de xsd.
xjc -p com.test.users ..\xsd\user.xsd
De sortie de cette commande est
parsing a schema...
compiling a schema...
com\test\users\ObjectFactory.java
com\test\users\User.java
com\test\users\Users.java
com\test\users\package-info.java
Annoté User.java avec @XmlRootElement(name="utilisateur").
fichier - UserService.java
package com.test.endpoints;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.test.users.User;
@Controller
@RequestMapping("/users")
public class UserService {
@RequestMapping(value="/new", method=RequestMethod.POST)
@ResponseBody
public User createUser(@RequestBody User user) {
System.out.println(user.getFirstName());
return user;
}
}
Testé l'api REST avec cette commande curl
curl -X POST -HContent-type:application/xml -HAccept:application/xml --data "<?xml version="1.0" encoding="UTF-8"?><user><id>1</id><email>[email protected]</email><first_name>first_name</first_name><last_name>last_name</last_name></user>" http://localhost:8080/Test/rest/users/new
De sortie est
The request sent by the client was syntactically incorrect ()
Quelqu'un peut-il svp m'indiquer où je vais mal.
Grâce
OriginalL'auteur Uma Shankar | 2011-03-14
Vous devez vous connecter pour publier un commentaire.
J'ai été en cours d'exécution sur la même question. Voici ce que ma méthode de Contrôleur ressemblait:
En gros, j'allais le retour de l'objet utilisateur comme une preuve de concept pour faire en sorte que mon POST a été fonctionne correctement. Cependant, j'ai continué à courir dans la "syntaxe incorrecte". Une fois que j'ai réellement mis à jour mon code pour récupérer un Utilisateur valide de l'objet comme suit:
il a commencé à travailler correctement.
J'ai testé mon RESTE de l'API à l'aide de la commande CURL suivante:
À l'aide d'une API différente de la liste des utilisateurs, j'ai pu vérifier que mon nouvel utilisateur a été correctement créé.
Encore une fois, vous ne savez pas si c'est exactement le même problème que vous rencontrez, mais cela a résolu pour moi.
Grâce,
Quinn
OriginalL'auteur Quinn
Vous pouvez essayer de changer le @RequestMapping sur la classe à partir de:
:
Et puis modifiez la déclaration de la méthode:
L'url deviendrait alors: http://localhost:8080/rest/users/create, parce que le printemps va prendre la dernière partie de l'url à partir de la méthode nom de.
Essayez de donner à la méthode de création d'un paramètre vide de la liste. Cela vous aidera à voir si le problème est avec le mappage d'url, ou avec le @RequestBody annotation. Je devine son avec @RequestBody depuis le mappage d'url a l'air bien, mais son bon de vérifier. Ensuite, vous pouvez écrire un test unitaire pour être sûr de la unmarshaller peut analyser votre XML.
OriginalL'auteur Kevin
Essayez de modifier la courbure de la ligne de
Leur ont été guillemets dans le XML, ce qui peut avoir interféré avec l'entrée
Il n'est pas de la boucle, c'est la coquille de comportement. Désolé, ça n'aide pas
OriginalL'auteur David Rabinowitz