Je développe un service Web interopérable en utilisant WCF que je consomme à partir d'un client Java. Lorsque j'ai créé la classe proxy, elle a généré toutes les méthodes getter et setter ainsi qu'un JAXBElement<String>
champ. J'ai cherché cela dans l'API JDK et j'ai trouvé le constructeur:
JAXBElement(QName name, Class<T> declaredType, Class scope, T value)
Comment dois-je utiliser ce constructeur? Veuillez expliquer les paramètres et faites-moi savoir s'il existe un bon didacticiel sur Internet décrivant son utilisation.
Une solution à ce problème est que vous n'avez pas besoin de créer un constructeur séparé pour créer un JAXBElement
. L'élément respecté peut être récupéré à partir de la méthode objectFactory.create........()
. Supposons que vous vouliez créer et définir une valeur dans l'objet de réponse et que l'argument soit du type JAXBElement
, alors vous devez procéder comme suit:
someResponseObj.setMyValue(objectFactory.create.......());
/*method name that will be return a JAXBElement in setter()*/
Remarque: Veuillez vérifier la référence ObjectFactory
car il peut y avoir plusieurs classes ObjectFactory
dans le code généré, vous devez donc faire référence à celle qui est associée à la classe de cette classe. paquet.
Je fais exactement la même chose, en utilisant un Java Client pour consommer le service Web WCF. J'utilise le plugin jaxws maven pour générer le code côté client.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<configuration>
<packageName>com.package1</packageName>
<sourceDestDir>src/main/Java</sourceDestDir>
<wsdlDirectory>src/main/resources</wsdlDirectory>
<wsdlFiles>
<wsdlFile>wcf_webservice.wsdl</wsdlFile>
</wsdlFiles>
</configuration>
</plugin>
Vous devriez avoir une classe ObjectFactory dans votre com.package1
que vous pouvez utiliser pour créer vos JAXBElements pour vous, par exemple:
ObjectFactory factory = new ObjectFactory();
MyObject myObject = new MyObject();
JAXBElement<MyObject> elem = factory.createMyObject(myObject);
Juste comme note latérale, vous devrez aplatir le wcf wsdl avant que jaxws puisse l'utiliser.
Juste au cas où quelqu'un se retrouverait ici à la recherche d'une solution: Au lieu d'utiliser JAXBElement, on ne peut utiliser que le Type en définissant generateElementProperty sur false dans un fichier de liaisons.
Dans mon cas, j'utilise maven pour générer les fichiers de raccord à partir de wsdl.
fichier pom partiel et fichier de liaisons (dans cette configuration s'appelle javabindings.xml)
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.2.9</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/wsdl2Java/generated-sources/src/main/Java</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/resources/yourWsdlFileOrURL.wsdl</wsdl>
<extraargs>
<extraarg>-verbose</extraarg>
<extraarg>-b</extraarg>
<extraarg>${basedir}/src/main/resources/javabindings.xml</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2Java</goal>
</goals>
</execution>
</executions>
</plugin>
<jaxb:bindings version="2.0"
xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb"
xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jaxb:bindings schemaLocation="http://localhost:15002/MiddlewareDataServiceConversion?xsd=xsd0">
<jaxb:bindings node="/xs:schema">
<jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>
</jaxb:bindings>
Je suis tombé sur cette question alors que je cherchais la même réponse. J'ai posté une réponse mais j'ai trouvé quelques problèmes. Voici une façon de procéder:
new javax.xml.bind.JAXBElement(
new javax.xml.namespace.QName("http://locationOfURI", "nameOfElement"),
javax.xml.bind.JAXBElement.class,
null, what your object's value is );
Le dernier signifie le paramètre type de JAXBElement
.
J'espère que cela fonctionne.
Le premier paramètre nom est un nom qualifié (nom local + espace de nom) de l'élément XML que vous mettez en miroir.
declareType est l'objet classe de la classe à laquelle vous liez votre élément XML.
scope est la portée d'utilisation de l'élément XML, mais vous pouvez le définir sur null.
valeur est une instance de la classe declareType c'est-à-dire l'objet Java réel lié à l'instance d'élément XML réelle).
Alors, où est l'utilisation .. et l'exemple. Je le veux..
Je l'ai trouvé. Alors peut-être que tu fais ça .. Ça va marcher.
Text t = new Text();
t.setValue("I need limo transportation");
JAXBElement<Text> text = new JAXBElement(SERVICE, Text.class, t);
J'ai eu des problèmes en essayant les méthodes ci-dessus en utilisant JAXBElement selon la documentation et j'ai trouvé cela à la place, ce qui fonctionnait parfaitement pour moi.
import javax.xml.bind.*;
JAXBContext jc = JAXBContext.newInstance(YOURCLASS.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(yourInstantiatedClass, System.out);
Essayez d'utiliser minOccurs = "1" au lieu de minOccurs = "0" dans votre wsdl. Pour une (bonne) raison, le générateur de code a besoin de ces informations pour convertir les paramètres en paramètres de type Java Java).