Erreur de génération de client WebService avec JDK8

227

J'ai besoin de consommer un service web dans mon projet. J'utilise NetBeans donc j'ai fait un clic droit sur mon projet et j'ai essayé d'ajouter un nouveau "client de service Web". La dernière fois que j'ai vérifié, c'était la façon de créer un client de service Web. Mais cela a abouti à une AssertionError, disant:

java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: jar: file: /path/to/glassfish/modules/jaxb-osgi.jar! /com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: échec de lecture du document de schéma ' xjc.xsd ', car l'accès au 'fichier' n'est pas autorisé en raison de la restriction définie par la propriété accessExternalSchema .

La plate-forme Java par défaut pour NetBeans était JDK8 (la version officielle d'Oracle), donc quand j'ai changé mon fichier netbeans.conf et fait JDK7 (d'Oracle, aussi) par défaut, tout a bien fonctionné. Je pense donc que le problème est avec JDK8. Voici ma java -versionsortie:

Java version "1.8.0"
Java (TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot (TM) 64-Bit Server VM (build 25.0-b70, mode mixte)

Pour l'instant, je garde JDK7 comme plate-forme Java par défaut. S'il existe un moyen de faire fonctionner JDK8, veuillez le partager.

un B
la source
2
J'ai rencontré un problème dans Eclipse selon lequel les sources jaxb n'étaient pas générées lors de l'utilisation de m2eclipse et jdk1.8. Dans la vue des marqueurs, j'ai vu une erreur similaire à propos de "accessExternalSchema". Lorsque j'ai appliqué la solution choisie ci-dessous, redémarré Eclipse et nettoyé le projet, les sources ont été générées!
Jonas Berlin

Réponses:

403

Eh bien, j'ai trouvé la solution. (basé sur http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Créez un fichier nommé jaxp.properties(s'il n'existe pas) sous /path/to/jdk1.8.0/jre/libpuis écrivez cette ligne dedans:

javax.xml.accessExternalSchema = all

C'est tout. Profitez de JDK 8.

un B
la source
12
Fonctionne également pour intelliJ.
Mafro34
1
Je peux également confirmer que cette solution fonctionne pour maven build dans eclipse avec maven et jaxb-plugin. Quelqu'un peut-il expliquer pourquoi vous n'avez pas besoin de cette propriété pour Java7?
Danny Lo
3
Cela a fonctionné pour moi, mais j'ai dû mettre le fichier sous /path/to/jdk1.8.0/libpas dans le jrerépertoire supplémentaire .
Geoff
21
Ce n'est pas très portable. Vous devrez modifier une installation JDK locale sur une machine de chaque développeur qui essaie de construire le projet.
Natix
7
cela ne fonctionne pas pour moi, les éléments suivants ont fonctionné: javax.xml.accessExternalDTD = all, je peux également définir cela dans le code et cela fonctionne: System.setProperty ("javax.xml.accessExternalDTD", "all");
qartal
118

Pas une vraie réponse mais plutôt une référence.

Si vous utilisez le plug-in jaxws Maven et que vous obtenez le même message d'erreur, ajoutez la propriété mentionnée à la configuration du plug-in:

...
<plugin>
  <groupId>org.jvnet.jax-ws-commons</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <version>2.3</version>
  <configuration>
    <!-- Needed with JAXP 1.5 -->
    <vmArgs>
        <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
    </vmArgs>
  </configuration>
</plugin>
jassuncao
la source
3
La accessExternalSchema=allvaleur est définie par défaut si vous utilisez des versions ultérieures (comme 0.12.3) du org.jvnet.jaxb2.maven2:maven-jaxb2-pluginplugin.
Jon Onstott
Ce qui précède n'a pas fonctionné pour moi. Cette version a fait: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <version> $ {version.jaxws.plugin} </version> <configuration> < ! - Nécessaire avec JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon
@JonOnstott: avoir la dernière version 2.4.1 et cela ne fonctionne pas par défaut. J'ai dû ajouter cela comme dans la réponse.
Robert Niestroj
36

J'exécute des builds ant dans Eclipse IDE (4.4, Luna, sur Windows 7 x64). Plutôt que de modifier la bibliothèque JRE installée ou tout script ant (j'ai plusieurs projets qui incluent XJC dans leurs builds), je préfère changer les paramètres Eclipse "Configurations d'outils externes" et ajouter ce qui suit aux arguments VM pour la configuration de build Ant:

-Djavax.xml.accessExternalSchema=all
gb96
la source
2
J'utilise wsdl2java.bat d'Apache CXF. Je viens donc d'insérer l'option JVM dans ce fichier BAT. Ça marche.
ka3ak
1
Je pourrais également ajouter que si nous incluons cette option comme paramètre ant, toutes les autres inclusions mentionnées ici sont excessives. Mais pas l'inverse! C'est donc la meilleure solution. +1 (bien sûr, les utilisateurs de Maven doivent effectuer les changements appropriés dans les options de Maven)
Gangnus
1
J'ai eu un problème similaire lorsque j'ai essayé d'exécuter mvn clean install, je viens d'ajouter cet indicateur ci-dessus et il a été déployé avec succès. Merci
Spear A1
30

Les travaux suivants pour wsimport 2.2.9 inclus dans jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
tanderson
la source
Cela fonctionne pour moi. J'ai essayé avec jdk 1.8.0_65 et cela n'a pas fonctionné, alors assurez-vous que vous utilisez jdk 1.8.0_66 ou une version ultérieure.
jabe
2
Ceci est la bonne réponse lors de l'utilisation wsimportdirecte.
Christopher Schultz
20

Dans mon cas, en ajoutant:

javax.xml.accessExternalSchema = all

à jaxp.properties n'a pas fonctionné, je dois ajouter:

javax.xml.accessExternalDTD = all

Mon environnement est Linux Mint 17 et Java 8 Oracle. Je vais le mettre là comme réponse pour les personnes ayant le même problème.

moretti.fabio
la source
2
Cela dépend si vous souhaitez autoriser l'accès à la DTD externe ou au schéma XML (XSD). DTD est le prédécesseur du schéma XML. Dans certains cas, vous devrez peut-être définir les deux!
Philip Helger
17

J'ai testé cela pour la version 2.4 de l'artefact org.codehaus.mojo et cela a fonctionné ~

<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.4.1</version>
        <executions>
            <execution>

                <goals>
                    <goal>wsimport</goal>
                </goals>
                <configuration>
                    <wsdlDirectory>path/to/dir/wsdl</wsdlDirectory>
                </configuration>
                <id>wsimport-web-service</id>
                <phase>generate-sources</phase>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>javax.xml</groupId>
                <artifactId>webservices-api</artifactId>
                <version>${webservices-api-version}</version>
            </dependency>
        </dependencies>
        <configuration>
            <vmArgs>
                <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
            </vmArgs>
            <sourceDestDir>generated-sources/jaxws-wsimport</sourceDestDir>
            <xnocompile>true</xnocompile>
            <verbose>true</verbose>
            <extension>true</extension>
            <sei>/</sei>
        </configuration>
    </plugin>
</plugins>
Mehdi
la source
1
C'est peut-être le vmArgs -Djavax.xml.accessExternalSchema=allqui est configuré dans votre déclaration de plugin. Il est discuté dans Netbeans Bug 244891
kosgeinsky
15

Voici un conseil pour les utilisateurs gradle sans droits d'administrateur: ajoutez cette ligne à votre tâche jaxb:

System.setProperty('javax.xml.accessExternalSchema', 'all')

Il ressemblera à ceci:

jaxb {
    System.setProperty('javax.xml.accessExternalSchema', 'all')
    xsdDir = "${project.name}/xsd"
    xjc {
        taskClassname = "com.sun.tools.xjc.XJCTask"
        args = ["-npa", "-no-header"]
    }
}
Java_Waldi
la source
12

Si vous rencontrez ce problème lors de la conversion de wsdl en jave avec le plugin cxf-codegen , vous pouvez le résoudre en configurant le plugin en fork et en fournissant l'option JVM "-Djavax.xml.accessExternalSchema = all" supplémentaire.

        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>${cxf.version}</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <fork>always</fork>
                        <additionalJvmArgs>
                            -Djavax.xml.accessExternalSchema=all
                        </additionalJvmArgs>
pjklauser
la source
1
Merci! toutes les options ci-dessus n'aident pas et la vôtre fonctionne pour moi
ludenus
10

J'obtenais également un type d'erreur similaire dans Eclipse lors du test d'un programme de service Web sur le serveur Web Glassfish 4.0: java.lang.AssertionError: org.xml.sax.SAXParseException; systemId: bundle://158.0:1/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; schema_reference: Failed to read schema document 'xjc.xsd', because 'bundle' access is not allowed due to restriction set by the accessExternalSchema property.

J'ai ajouté javax.xml.accessExternalSchema = Alldansjaxp.properties , mais le travail de doesnot pour moi.

Cependant, j'ai trouvé une solution ci-dessous qui fonctionne pour moi: Pour GlassFish Server, je dois modifier le domain.xmlchemin d'accès de GlassFish, <path>/glassfish/domains/domain1ou domain2/config/domain.xml:) et ajouter, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>sous la <java-config>balise

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... puis redémarrez le serveur GlassFish

Debashish
la source
Je vois deux instances de <java-config classpath-suffix…> dans le fichier domain.xml. Les deux contiennent des sections <jvm-options>. J'ai placé la ligne ci-dessus (avec les balises jvm-options) dans les deux sections. Il ne fonctionne toujours pas pour exécuter le service Web de test. Je sais que le projet fonctionne parce que le fichier client codé à la main accède aux fichiers de service et imprime les bonnes informations dans la console (à partir de la base de données associée aux fichiers de service).
Max West
<p> J'ai fermé le projet et le projet client, j'ai quitté NetBeans et j'ai attendu que Glassfish s'arrête (il affiche un indicateur de progression pendant sa fermeture). Ensuite, j'ai redémarré Netbeans, rechargé le projet Web Services, rechargé le fichier Client (c'est juste une classe Java dans un dossier de projet Java séparé / régulier). Le client imprime les tableaux, ce qui montre que le serveur et le serveur de base de données fonctionnent, ainsi que les services Web et les EJB du service SOAP. Cela ne fonctionne tout simplement pas. Le paramètre accessExternalSchema est enterré quelque part et ne se configure pas correctement dans le nouveau JDK. </p>
Max West
7

Activation de l'accès au schéma externe

Vous devez activer l'IDE et le serveur GlassFish pour accéder au schéma externe afin d'analyser le fichier WSDL du service Web. Pour activer l'accès, vous devez modifier les fichiers de configuration de l'EDI et du serveur GlassFish. Pour plus de détails, consultez la FAQ Comment activer l'analyse de WSDL avec un schéma externe? Configuration de l'IDE

Pour générer un client de service Web dans l'IDE à partir d'un service Web ou d'un fichier WSDL, vous devez modifier le fichier de configuration IDE (netbeans.conf) pour ajouter le commutateur suivant à netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Pour plus d'informations sur la localisation et la modification du fichier de configuration netbeans.conf, consultez la FAQ Netbeans Conf. Configuration du serveur GlassFish

Si vous déployez sur le serveur GlassFish, vous devez modifier le fichier de configuration du serveur GlassFish (domain.xml) pour permettre au serveur d'accéder aux schémas externes pour analyser le fichier wsdl et générer le client de test. Pour activer l'accès aux schémas externes, ouvrez le fichier de configuration GlassFish (GLASSFISH_INSTALL / glassfish / domaines / domain1 / config / domain.xml) et ajoutez l'élément d'option JVM suivant (en gras). Vous devrez redémarrer le serveur pour que la modification prenne effet.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Ashwin Patil
la source
6

Lorsque vous utilisez Maven avec IntelliJ IDE, vous pouvez ajouter -Djavax.xml.accessExternalSchema=allau paramètre Maven sous Options JVM pour la configuration de Maven Build Tools Runner

Dexter Legaspi
la source
Fonctionne avec Linux Mint 17.3, JDK 1.8.0.74 et Intellij IDEA 15. Thx.
stuchl4n3k
Agréable ! cela fonctionne aussi pour moi lorsque j'utilise "mvn clean install -Djavax.xml.accessExternalSchema = all" directement sur le terminal indépendamment de l'IDE
Tanorix
5

Cela fonctionne sur jdk1.8.0_65

wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Stephen
la source
4

Pour ceux qui utilisent la tâche ANT wsimport, un moyen de passer l'option comme suggéré par @CMFly et spécifié dans la documentation est le suivant:

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Daniele Piccioni
la source
4

Il est maintenant corrigé dans la version 2.5 (sortie en juillet / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Pour les versions 2.4.x, il existe une solution de contournement (comme décrit dans https://github.com/mojohaus/jaxws-maven-plugin/issues/4 ):

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxws-maven-plugin</artifactId>
        <version>2.4.1</version>
        <dependencies>
            <dependency>
                <groupId>com.sun.xml.ws</groupId>
                <artifactId>jaxws-tools</artifactId>
                <version>2.2.10</version>
            </dependency>
        </dependencies>
    </plugin>
DGardim
la source
3

Je l'ai utilisé avec un projet maven normal et l'ai résolu avec cette configuration de dépendance de plugin pour exécuter xjc plugin:

     <plugin>
        <!-- Needed to run the plugin xjc en Java 8 or superior -->
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0-alpha-2</version>
        <executions>
            <execution>
                <id>set-additional-system-properties</id>
                <goals>
                    <goal>set-system-properties</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <properties>
                <property>
                    <name>javax.xml.accessExternalSchema</name>
                    <value>all</value>
                </property>
                <property>
                    <name>javax.xml.accessExternalDTD</name>
                    <value>all</value>
                </property>
            </properties>
        </configuration>
    </plugin>
EliuX
la source
Avec cette solution, j'avais besoin de mettre à jour jaxws-maven-pluginà 2.5 comme spécifié dans les autres réponses mojohaus.org/jaxws-maven-plugin/usage.html Mais quand même, meilleure réponse dans mon cas, merci!
DependencyHell
3

Créez un fichier nommé jaxp.properties(s'il n'existe pas) sous le chemin de votre "version JDK / jre / lib" puis ajoutez-y cette ligne:

javax.xml.accessExternalSchema = all
Gayan Mettananda
la source
2

Une autre solution à résoudre: wiki.netbeans.org

L'assistant Web Service Client dans l'EDI analyse le fichier WSDL lors de la génération d'un client de service Web à partir d'un service Web ou d'un fichier WSDL. Vous devez modifier le fichier de configuration IDE (netbeans.conf) pour ajouter le commutateur suivant aux options netbeans_default_options. Vous devrez redémarrer l'IDE pour que la modification prenne effet.

-J-Djavax.xml.accessExternalSchema=all

Lors du déploiement sur GlassFish, vous devez activer l'accès au schéma externe pour générer un client de test pour un service Web. Pour activer l'accès, vous devez modifier le fichier de configuration du serveur GlassFish (GLASSFISH_INSTALL / glassfish / domaines / domain1 / config / domain.xml) et ajouter l'élément d'option JVM suivant. Vous devrez redémarrer le serveur pour que la modification prenne effet.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Özgür Akıncı
la source
Je suis désolé, je ne peux penser à rien d'autre.
Özgür Akıncı
1

Si vous utilisez ant, vous pouvez ajouter un jvmarg à vos appels java:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
la source
Pouvez-vous être plus précis où vous mettez cela dans un fichier fourmi?
John L
1

Une solution portable très simple serait de placer la ligne de code suivante quelque part dans une partie cruciale de votre code, une partie dont vous êtes sûr qu'elle sera exécutée (par exemple directement dans la méthode principale):

System.setProperty("javax.xml.accessExternalDTD", "all");

Cela définit la propriété système requise par programme, sans avoir à effectuer des modifications maven pom.xml délicates (qui pour une raison quelconque ne fonctionnaient pas pour moi).

R Hoekstra
la source
1

Je viens d'essayer que si vous utilisez SoapUI (5.4.x)et utilisez l' Apache CXFoutil pour générer du code java, le mettre javax.xml.accessExternalSchema = alldans le YOUR_JDK/jre/lib/jaxp.propertiesfichier fonctionne également.

TGU
la source
0

Une autre alternative consiste à mettre à jour le script shell wsimport.sh en ajoutant ce qui suit:

Le wsimport.sh se trouve dans ce répertoire:

jaxws-ri.2.2.28 / bin

exec "$ JAVA" $ WSIMPORT_OPTS -Djavax.xml.accessExternalSchema = all -jar "$ JAXWS_HOME / lib / jaxws-tools.jar" "$ @"

Percy Williams
la source
J'adorerais essayer votre suggestion, mais apparemment jaxws-ri.2.2.28 / bin n'est pas n'importe où sur ma machine.
Max West
0

Autre référence: si vous utilisez le maven-jaxb2-plugin, avant la version 0.9.0, vous pouvez utiliser la solution de contournement décrite sur ce problème , dans laquelle ce comportement a affecté le plug-in.

Niel de Wet
la source