Question

J'ai besoin de consommer un service Web dans mon projet.J'utilise NetBeans, j'ai donc cliqué avec le bouton droit sur mon projet et essayé d'ajouter un nouveau "Web Service Client".La dernière fois que j'ai vérifié, c'était ainsi que l'on pouvait créer un client de service Web.Mais cela a abouti à une AssertionError, disant :

java.lang.AssertionError :org.xml.sax.SAXParseException;ID système :jar:file:/path/to/glassfish/modules/jaxb-osgi.jar!/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd;numéro de ligne:52 ;Numéro de colonne :88 ;référence_schéma :Échec de la 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 le accessExternalSchema propriété.

La plate-forme Java par défaut pour NetBeans était JDK8 (la version officielle d'Oracle), donc lorsque j'ai modifié mon fichier netbeans.conf et défini JDK7 (d'Oracle également) par défaut, tout a bien fonctionné.Je pense donc que le problème vient du JDK8.Voici mon java -version sortir:

version java "1.8.0"
Environnement d'exécution Java(TM) SE (build 1.8.0-b132)
Machine virtuelle de serveur Java HotSpot(TM) 64 bits (build 25.0-b70, mode mixte)

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

Était-ce utile?

La solution

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/lib puis écrivez-y cette ligne :

javax.xml.accessExternalSchema = all

C'est tout.Profitez du JDK 8.

Autres conseils

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

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

...
<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>

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

-Djavax.xml.accessExternalSchema=all

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

wsimport -J-Djavax.xml.accessExternalSchema=all ....

Dans mon cas, j'ajoute :

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.

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>

Voici un indice pour les utilisateurs diplômés 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"]
    }
}

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

        <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>

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 = All dans jaxp.properties, mais cela ne fonctionne pas pour moi.

Cependant, j'ai trouvé une solution ci-dessous qui fonctionne pour moi :Pour GlassFish Server, je dois modifier le domain.xml de la viande de verre, chemin:<path>/glassfish/domains/domain1 ou domain2/config/domain.xml) et ajouter, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>sous le <java-config> étiqueter

....

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

Lorsque vous utilisez Maven avec IntelliJ IDE, vous pouvez ajouter -Djavax.xml.accessExternalSchema=all au paramètre Maven sous Options JVM pour Configuration du programme d'exécution des outils de construction Maven

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

Vous devez activer l'EDI 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'IDE 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'EDI

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 de l'IDE (netbeans.conf) pour ajouter le commutateur suivant à netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

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

Si vous effectuez un déploiement 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/domains/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>

Pour ceux qui utilisent la tâche ANT wsimport, une manière de passer l'option comme suggéré par @CMFly et spécifié dans le Documentation est le suivant:

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>

Je l'ai utilisé avec un habitué maven projet, et je l'ai résolu avec cette configuration de dépendance de plugin pour exécuter le 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>

Cela fonctionne sur jdk1.8.0_65

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

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

Pour les versions 2.4.x, il existe une solution de contournement (telle que décrite 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>

Autre solution à aborder : wiki.netbeans.org

L'assistant Client de service Web de 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 netbeans_default_options.Vous devrez redémarrer l'EDI 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/domains/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>

Si vous utilisez Ant, vous pouvez ajouter un jvmarg à vos appels Java :

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />

Une solution portable très simple serait de placer la ligne de code suivante quelque part dans une partie cruciale de votre code, 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 nécessaire par programme, sans avoir à effectuer des modifications délicates de maven pom.xml (qui, pour une raison quelconque, n'ont pas fonctionné pour moi).

Je viens d'essayer ça si vous utilisez SoapUI (5.4.x) et utilise Apache CXF outil pour générer du code java, mettez javax.xml.accessExternalSchema = all dans YOUR_JDK/jre/lib/jaxp.properties le fichier fonctionne également.

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" "$@"

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 cette question, dans lequel ce comportement a affecté le plugin.

NetBeans met à jour son tutoriel pour JDK8 et ce problème :

Premiers pas avec les services Web JAX-WS -> Activation de l'accès au schéma externe

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

javax.xml.accessExternalSchema = all
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top