Bonjour,
J'ai crée une classe qui récupère les données du formulaire de ma paje jsp sous forme d'un objet.
Je voudrais savoir si dans mon code client je peux lui passer comme entrée cet objet là?
Merci de vos réponses
Bonjour,
J'ai crée une classe qui récupère les données du formulaire de ma paje jsp sous forme d'un objet.
Je voudrais savoir si dans mon code client je peux lui passer comme entrée cet objet là?
Merci de vos réponses
Quand tu dis, comme entrée, je suppose que tu parle du WebServiceTemplate ?
Oui je veux dire à l'appelsource prend l'objet récupéré!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part webServiceTemplate.sendSourceAndReceiveToResult(URL,source, result);
Dans le webserviceTemplate tu as divers méthodes du type marshalSendAndReceive.
Celles-ci permettent d'utiliser un object en entrée, a condition que cet objet fasse partie d'un contexte de marshalling ( JiBx, JAXB ou autres ).
Bonjour, j'ai regardé un peu qques docs et je pense que je dois utiliser la méthode marshall() pour convertir mon objet java en xml.
Moi je récupère un objet rempli avec toutes les valeurs dont j'ai besoin mais voilà j'arrive pas exactement à savoir comment utiliser marshall, des fois je retrouve qu'il faut l'introduire dans le endpoint, dans le fichier application-context.xml et dans d'autres juste un traitement comme celàJe sais pas exactement comment faire et d'ou viennent les methodes createChien() et createPersonne().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import chienp.*; public class Creer { public static void main( String[] args ) { try { JAXBContext jc = JAXBContext.newInstance( "chienp" ); ObjectFactory factory = new ObjectFactory(); Chien medor = factory.createChien(); medor.setNom("medor"); Personne memere = factory.createPersonne(); memere.setNom("Michu"); memere.setAdresse("impasse du puit"); medor.setMaitre(memere); medor.setPuces(76); Marshaller m = jc.createMarshaller(); m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(medor, System.out); } catch( Exception e ) { e.printStackTrace(); } } }
Si quelqu'un peut m'eclairer ça sera sympa, emrci
voici mon code client:je veux modifier mon objet lb en xml et l'envoyer comme source du web service client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public class WebServiceClient { public String doRecupBean5(){ Languebean lb = new Languebean(); FacesContext context = FacesContext.getCurrentInstance(); //Récupérer un objet lb rempli avec les données saisies a partir du formulaire lb = (Languebean)context.getApplication().createValueBinding("#{langue}").getValue(context); //System.out.println(lb.getCODLAN()); String test = "<CVRequest xmlns=\"http://com.hr.ws/schema/rechercheL\"><LangueRech>"+lb.getCODLAN()+"</LangueRech></CVRequest>"; System.out.println(test); WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); StreamSource source = new StreamSource(new StringReader(test)); StreamResult result = new StreamResult(System.out); webServiceTemplate.sendSourceAndReceiveToResult("http://localhost:8080/spring-wsTest/rechercherLangueService/",source, result); return "valider"; }
j'ai compris ke mon objet lb doit être de type marshaller, d'abord est ce que c possible ce ke je veux faire? et si c le cas, comment faire, je crois ke ça est faux
Code : Sélectionner tout - Visualiser dans une fenêtre à part JAXBContext context = JAXBContext.newInstance("lb");
salut,
normalement tu as générer ton objectFactory à partir de ton xsd, non?
le JAXBContext est le context des classes générer de ton xsd et dont l'objectFactory résponsable de la construction des ses objects.
donc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 JAXBContext context = JAXBContext.newInstance(là tu met le nom du package ou sont générer tes objets).
Non en fait j'ai le code serveur d'un coté, j'ai le code client d'un autre coté(un autre projet) et j'ai les pages jsp (en utilisant JSF), je recupere le contenu du formulaire de la paje jsp à l'aide dele resultat est stocké dans mon objet lb de type langueBean, j'ai essayé d'utiliser ce resultat pour mon code client alors j'ai mis pour tester
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Languebean lb = new Languebean(); FacesContext context = FacesContext.getCurrentInstance(); lb = (Languebean)context.getApplication().createValueBinding("#{langue}").getValue(context);ça a marché il maffiche le resultat mais là je veux pas faire comme ça, je trouve que c pas très logik de faire a chaque fois lb.getAttribut, je me suis demandé si je peux manipuler cet objet lb rempli des données, en le formatant en xml et l'envoyer comme source de la partie cliente! alors on m'a conseillé d'utiliser Marshall mais ej sais pas comemnt l'adapter à mon cas!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 String test = "<CVRequest xmlns=\"http://com.hr.ws/schema/rechercheL\"><LangueRech>"+lb.getCODLAN()+"</LangueRech></CVRequest>"; StreamSource source = new StreamSource(new StringReader(test));
Sinon je n'ai pas généré des classes à partir de mon xsd!! Quand faut il faire ça??
j'ai mal compris ta question. En fait, les methodes que createCh.. et createPer... se trouve dans ton objectFactory et c'est générer à partir de xsd par JAXb cedernier va les utiliser pour mashaller et unmarshaller ce deux Object.
Oui mais là c un exemple que j'ai trouvé sur un site, j'ai essayé de l'appliquer à mon cas mais moi je n'ai pas généré un objectFactory, c'est pour celà je me demande comment appliquer l'exemple de chien ou personne à mon cas.
Est ce c'est indispensable de générer l'object factory pour utiliser marshall et unmarshall? et comment le faire?
non ce n'est pas indisponsable. En fait tu peux écrire les classes qui représenteront les types que tu as déclaré dans ton xsd. La ObjectFactory est gérerer automatiquement par des outils pour JAXb. D'ailleurs si tu utilise maven2 il existe un plugin xjc que tu peux utiliser.
Re Salut;
Après une galère j'ai enfin réussi à générer mon object factory et mes classes en utilisant jaxb, mais voilà au début quand j'execute mon mainj'ai une exception de type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 package client; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import ws.hr.com.schema.recherchel.CVRequestType; public class TestClient { public static void main( String[] args ) { CVRequestType CVR = new CVRequestType(); CVR.setLangueRech("francais"); Writer writer = null; // Create JAXB context and the marshaller try { JAXBContext context = JAXBContext.newInstance(CVRequestType.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // Console view marshaller.marshal(CVR, System.out); // otherwise file output writer = new FileWriter("TestLangue.xml"); marshaller.marshal(CVR, writer); } catch (JAXBException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // Clean resources by closing files try { writer.close(); } catch (Exception exp) { } } } }après qques recherches je suis tombé sur ce forum http://www.coderanch.com/t/222880/We...o-jaxws-sample bref j'ai telechargé le JAXB2_20061013.jar, je l'ai executé, j'ai regénéré mes classes et maintenant, j'ai cette erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part Incorrectly typed data found for annotation element public abstract javax.xml.bind.annotation.XmlAccessType javax.xml.bind.annotation.XmlAccessorType.value(), j'ai regardé un peu encore sur google, j'ai vu qu'on parle de jdk1.6, je travaille avec le 1.6 moi aussi mais c tjrs la même erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Type mismatch: cannot convert from XmlAccessType to AccessType
Est ce que vous avez une idée sur comment résoudre c eprobleme svp???
Re;
Mon problème précédent est résolu, j'avais un probleme dans le classpath;
maintenant je genere mon fichier xml et tou va bien, alors si j'ai bien compris, pour que mon code client fonctionne correctement, je dois ou bien mettre ce fichier xml généré en etrée du client ou bien j'utilise marshalSendAndRecieve.
Que fais exactement cette fonction et comment faut'il l'utiliser??
voici un simple exemple qui pourrait t'aider.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Object responseObject = getWebServiceTemplate().marshalSendAndReceive( clientRequest, new WebServiceMessageCallback() { public void doWithMessage(WebServiceMessage message) throws IOException { try { ((SoapMessage) message).setSoapAction(soapAction); secureWs(message, user); } catch (Exception e) { logger.error("Une Exception s'est produite lors de la creation du header de la requete SOAP"); e.printStackTrace(); } } });
Voici mon code client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 package client; import java.io.IOException; import java.io.StringReader; import javax.faces.context.FacesContext; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import metier.Languebean; import metier.RecupBean; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.client.core.WebServiceMessageCallback; import org.springframework.ws.client.core.WebServiceTemplate; import org.springframework.ws.client.core.support.WebServiceGatewaySupport; import org.springframework.ws.soap.SoapMessage; import ws.hr.com.schema.recherchel.CVRequestType; import ws.hr.com.schema.recherchel.ObjectFactory; public class WebServiceClient extends WebServiceGatewaySupport { public String doRecupBean() throws JAXBException{ Languebean lb = new Languebean(); FacesContext context = FacesContext.getCurrentInstance(); //Récupérer l'objet lb rempli des pages jsp lb = (Languebean)context.getApplication().createValueBinding("#{langue}").getValue(context); /*********Manipulation de mon objectFactory*************/ JAXBContext contextJC = JAXBContext.newInstance("ws.hr.com.schema.recherchel"); Marshaller marshaller = contextJC.createMarshaller(); ObjectFactory factory=new ObjectFactory(); CVRequestType CVR=(CVRequestType)(factory.createCVRequestType()); CVR.setLangueRech(lb.getCODLAN()); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(CVR, System.out); //Affichage du contenu de l'objet CVR /*****************************************************************************************/ Object responseObject = getWebServiceTemplate().marshalSendAndReceive( CVR, new WebServiceMessageCallback() { public void doWithMessage(WebServiceMessage message) throws IOException { try { ((SoapMessage) message).setSoapAction(""); } catch (Exception e) { logger.error("Une Exception s'est produite lors de la creation du header de la requete SOAP"); e.printStackTrace(); } } }); return "valider"; } }
Que faut il mettre dans setSoapAction?
quand j'execute j'obtiens cette erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 java.lang.IllegalStateException: No marshaller registered. Check configuration of WebServiceTemplate. org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:259) org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:252) client.WebServiceClient.doRecupBean5(WebServiceClient.java:72) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132) org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61) javax.faces.component.UICommand.broadcast(UICommand.java:109) javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97) javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171) org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32) org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95) org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70) javax.faces.webapp.FacesServlet.service(FacesServlet.java:139) org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
normalement dans ton objectFactory toutes les URL de request que tu demande sont déjà présente donc tu n'as pas à les spécifier.
dans ton fichier de configuration tu as déclaré un bean pour ton marshaller et ton unmarshaller.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> <property name="contextPath" value"ton packge pour l'objectFactory"/> </bean>
oui mais tu déclare où tes beans pour ton application. jaxb doit etre déclaré d'une façon ou d'une autre.
mes beans du coté serveur( les interfaces, les endpoint et les services) sont declaré dans spring-ws-servlet.xml qui se trouve dans un autre projet!!
Peux tu m'expliquer stp comment ça se passe.
parce que moi pour la partie cliente, j'ai crée les pages jsp, ensuite g crée une classe client, je recupère les données de mes pages jsp ensuite je les passe en entrée pour le client. j'ai pensé à utiliser marshal, alors j'ai vu qu'il faut que je crée un object factory avec jaxb à partir de mes fichiers xsd( qui se trouvent dans le projet où il ya le code de la partie serveur), je set mon objectFactory avec le bean récupéré de ma page jspensuite je génére un fichier xml contennat les donénes qui ont eté saisies de la page jsp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CVRequestType CVR=(CVRequestType)(factory.createCVRequestType()); CVR.setLangueRech(lb.getCODLAN());mnt j'aimerai envoyer ce fichier comme entrée du client mais pas de cetet manière
Code : Sélectionner tout - Visualiser dans une fenêtre à part marshaller.marshal(CVR, new File("src/ws/hr/com/schema/recherchel/out.xml"));je voulais utiliser marshalSendAndRecieve.
Code : Sélectionner tout - Visualiser dans une fenêtre à part static Resource resource = new ClassPathResource("src/ws/hr/com/schema/recherchel/out.xml");
Voilà a quel moment j'aurais du créer mon fichier de config??
private
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager