WebService Client-Generierungsfehler mit JDK8

227

Ich muss einen Webdienst in meinem Projekt verwenden. Ich verwende NetBeans, habe also mit der rechten Maustaste auf mein Projekt geklickt und versucht, einen neuen "Web Service Client" hinzuzufügen. Als ich das letzte Mal nachgesehen habe, war dies der Weg, um einen Webdienst-Client zu erstellen. Aber es führte zu einem AssertionError, der sagte:

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: Fehler beim Lesen des Schemadokuments ' xjc.xsd ', da der Zugriff auf 'Datei' aufgrund der durch die Eigenschaft accessExternalSchema festgelegten Einschränkung nicht zulässig ist .

Die Standard-Java-Plattform für NetBeans war JDK8 (die offizielle Version von Oracle). Als ich also meine Datei netbeans.conf änderte und JDK7 (auch von Oracle) als meine Standardversion verwendete, funktionierte alles einwandfrei. Ich denke, das Problem liegt bei JDK8. Hier ist meine java -versionAusgabe:

Java-Version "1.8.0"
Java (TM) SE-Laufzeitumgebung (Build 1.8.0-b132)
Java HotSpot (TM) 64-Bit-Server-VM (Build 25.0-b70, gemischter Modus)

Im Moment behalte ich JDK7 als meine Standard-Java-Plattform. Wenn es eine Möglichkeit gibt, JDK8 zum Laufen zu bringen, teilen Sie diese bitte mit.

ab
quelle
2
In Eclipse ist ein Problem aufgetreten, dass bei Verwendung von m2eclipse und jdk1.8 keine Jaxb-Quellen generiert wurden. In der Markierungsansicht wurde ein ähnlicher Fehler bei "accessExternalSchema" angezeigt. Als ich die unten ausgewählte Lösung anwendete, Eclipse neu startete und das Projekt bereinigte, wurden die Quellen generiert!
Jonas Berlin

Antworten:

403

Nun, ich habe die Lösung gefunden. (basierend auf http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Erstellen Sie eine Datei mit dem Namen jaxp.properties(falls nicht vorhanden) unter /path/to/jdk1.8.0/jre/libund schreiben Sie diese Zeile hinein:

javax.xml.accessExternalSchema = all

Das ist alles. Viel Spaß mit JDK 8.

ab
quelle
12
Funktioniert auch für IntelliJ.
Mafro34
1
Ich kann diese Lösung auch als Maven Build in Eclipse mit Maven und Jaxb-Plugin bestätigen. Kann jemand erklären, warum Sie diese Eigenschaft für Java7 nicht benötigen?
Danny Lo
3
Das hat bei mir funktioniert, aber ich musste die Datei /path/to/jdk1.8.0/libnicht unter das weitere jreVerzeichnis stellen.
Geoff
21
Dies ist nicht sehr portabel. Sie müssten eine lokale JDK-Installation auf einem Computer jedes Entwicklers optimieren, der versucht, das Projekt zu erstellen.
Natix
7
Dies funktioniert bei mir nicht, das Folgende hat funktioniert: javax.xml.accessExternalDTD = all, auch ich kann dies im Code festlegen und es funktioniert: System.setProperty ("javax.xml.accessExternalDTD", "all");
Qartal
118

Keine tatsächliche Antwort, sondern eher als Referenz.

Wenn Sie das jaxws Maven-Plugin verwenden und dieselbe Fehlermeldung erhalten, fügen Sie der Plugin-Konfiguration die erwähnte Eigenschaft hinzu:

...
<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
quelle
3
Der accessExternalSchema=allWert wird standardmäßig festgelegt, wenn Sie spätere Versionen (wie 0.12.3) des org.jvnet.jaxb2.maven2:maven-jaxb2-pluginPlugins verwenden.
Jon Onstott
Das obige hat bei mir nicht funktioniert. Diese Version hat: <plugin> <groupId> org.codehaus.mojo </ groupId> <artifactId> jaxws-maven-plugin </ifactId> <version> $ {version.jaxws.plugin} </ version> <configuration> < ! - Wird mit JAXP 1.5 benötigt -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </ vmArg> </ vmArgs> </ configuration> </ plugin>
Dr4gon
@ JonOnstott: habe die neueste Version 2.4.1 und es funktioniert nicht standardmäßig. Musste dies wie in der Antwort hinzufügen.
Robert Niestroj
36

Ich führe Ant Builds in Eclipse IDE (4.4, Luna, unter Windows 7 x64) aus. Anstatt die installierte JRE-Bibliothek oder Ant-Skripte zu ändern (ich habe mehrere Projekte, deren Builds XJC enthalten), ziehe ich es vor, die Eclipse-Einstellungen "Externe Tools-Konfigurationen" zu ändern und den VM-Argumenten für die Ant-Build-Konfiguration Folgendes hinzuzufügen:

-Djavax.xml.accessExternalSchema=all
gb96
quelle
2
Ich benutze wsdl2java.bat von Apache CXF. Also habe ich gerade die JVM-Option in diese BAT-Datei eingefügt. Es klappt.
Ka3ak
1
Ich könnte auch hinzufügen, als wenn wir diese Option als ant-Parameter einschließen, sind alle anderen hier erwähnten Einschlüsse übertrieben. Aber nicht umgekehrt! Das ist also die beste Lösung. +1 (natürlich sollten Maven-Benutzer die Maven-Optionen entsprechend ändern)
Gangnus
1
Ich hatte ein ähnliches Problem, als ich versuchte, mvn clean install auszuführen. Ich habe gerade dieses obige Flag hinzugefügt und es wurde erfolgreich bereitgestellt. Danke
Speer A1
30

Folgendes funktioniert für wsimport 2.2.9, das in jdk 1.8.0_66 enthalten ist:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
Tanderson
quelle
Das funktioniert bei mir. Ich habe es mit jdk 1.8.0_65 versucht und das hat nicht funktioniert. Stellen Sie also sicher, dass Sie jdk 1.8.0_66 oder höher verwenden.
Jabe
2
Dies ist die richtige Antwort bei wsimportdirekter Verwendung .
Christopher Schultz
20

In meinem Fall hinzufügen:

javax.xml.accessExternalSchema = all

zu jaxp.properties hat nicht funktioniert, ich muss hinzufügen:

javax.xml.accessExternalDTD = all

Meine Umgebung ist Linux Mint 17 und Java 8 Orakel. Ich werde es dort als Antwort für Leute mit dem gleichen Problem setzen.

moretti.fabio
quelle
2
Dies hängt davon ab, ob Sie den Zugriff auf eine externe DTD oder auf ein XML-Schema (XSD) zulassen möchten. DTD ist der Vorgänger von XML Schema. Es kann auch Fälle geben, in denen Sie beide einstellen müssen!
Philip Helger
17

Ich habe dies für Version 2.4 von Artefakt org.codehaus.mojo getestet und das hat ~ funktioniert

<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
quelle
1
Vielleicht sind es die vmArgs -Djavax.xml.accessExternalSchema=all, die in Ihrer Plugin-Deklaration konfiguriert sind. Es wird in Netbeans Bug 244891
kosgeinsky
15

Hier ist ein Hinweis Hinweis für Gradle-Benutzer ohne Administratorrechte: Fügen Sie diese Zeile zu Ihrer JaxB-Aufgabe hinzu:

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

es wird so aussehen:

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

Wenn Sie dieses Problem beim Konvertieren von wsdl in jave mit dem cxf-codegen-plugin erhalten , können Sie es lösen, indem Sie das Plugin auf fork konfigurieren und die zusätzliche JVM-Option "-Djavax.xml.accessExternalSchema = all" bereitstellen.

        <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
quelle
1
Vielen Dank! Alle oben genannten Optionen helfen nicht und Ihre arbeitet für mich
ludenus
10

Beim Testen eines Webservice-Programms auf dem Glassfish 4.0-Webserver wurde in Eclipse eine ähnliche Fehlerart angezeigt: 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.

Ich habe hinzugefügt , javax.xml.accessExternalSchema = Allin jaxp.properties, aber für mich doesnot Arbeit.

Allerdings habe ich hier unten eine Lösung gefunden, die für mich funktioniert: Für GlassFish Server muss ich domain.xmlden GlassFish-Pfad ändern : <path>/glassfish/domains/domain1oder domain2/config/domain.xml) und <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>unter dem <java-config>Tag hinzufügen

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... und starten Sie dann den GlassFish-Server neu

Debashish
quelle
Ich sehe zwei Instanzen von <java-config classpath -uffix…> in der Datei domain.xml. Beide enthalten Abschnitte von <jvm-options>. Ich habe die obige Zeile (mit den Tags jvm-options) in beide Abschnitte eingefügt. Es funktioniert immer noch nicht, den Test-Webdienst auszuführen. Ich weiß, dass das Projekt funktioniert, da die handcodierte Client-Datei auf die Servicedateien zugreift und die richtigen Informationen in der Konsole ausgibt (aus der Datenbank, die den Servicedateien zugeordnet ist).
Max West
<p> Ich habe das Projekt geschlossen, und das Client-Projekt hat NetBeans beendet und darauf gewartet, dass sich Glassfish selbst herunterfährt (es zeigt eine Fortschrittsanzeige, während es heruntergefahren wird). Dann habe ich Netbeans neu gestartet, das Web Services-Projekt neu geladen und die Client-Datei neu geladen (es ist nur eine Java-Klasse in einem separaten / regulären Java-Projektordner). Der Client druckt die Tabellen aus, aus denen hervorgeht, dass der Server und der Datenbankserver sowie die SOAP-Dienst-Webdienste und -EJBs funktionieren. Es funktioniert einfach nicht. Die accessExternalSchema-Einstellung ist irgendwo vergraben und wird im neuen JDK nicht richtig eingestellt. </ P>
Max West
7

Aktivieren des Zugriffs auf ein externes Schema

Sie müssen die IDE und den GlassFish-Server für den Zugriff auf ein externes Schema aktivieren, um die WSDL-Datei des Webdienstes zu analysieren. Um den Zugriff zu aktivieren, müssen Sie die Konfigurationsdateien der IDE und des GlassFish-Servers ändern. Weitere Informationen finden Sie in den FAQ. So aktivieren Sie das Parsen von WSDL mit einem externen Schema. IDE konfigurieren

Um einen Webdienst-Client in der IDE aus einem Webdienst oder einer WSDL-Datei zu generieren, müssen Sie die IDE-Konfigurationsdatei (netbeans.conf) ändern, um den folgenden Schalter zu netbeans_default_options hinzuzufügen.

-J-Djavax.xml.accessExternalSchema=all

Weitere Informationen zum Suchen und Ändern der Konfigurationsdatei netbeans.conf finden Sie in den häufig gestellten Fragen zu Netbeans Conf. Konfigurieren des GlassFish-Servers

Wenn Sie auf dem GlassFish-Server bereitstellen, müssen Sie die Konfigurationsdatei des GlassFish-Servers (domain.xml) ändern, damit der Server auf externe Schemas zugreifen kann, um die WSDL-Datei zu analysieren und den Testclient zu generieren. Um den Zugriff auf externe Schemas zu ermöglichen, öffnen Sie die GlassFish-Konfigurationsdatei (GLASSFISH_INSTALL / glassfish / domain / domain1 / config / domain.xml) und fügen Sie das folgende JVM-Optionselement hinzu (fett gedruckt). Sie müssen den Server neu starten, damit die Änderung wirksam wird.

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

Wenn Sie Maven mit IntelliJ IDE verwenden, können Sie -Djavax.xml.accessExternalSchema=alldie Maven-Einstellung unter JVM-Optionen für die Runner-Konfiguration von Maven Build Tools hinzufügen

Dexter Legaspi
quelle
Funktioniert mit Linux Mint 17.3, JDK 1.8.0.74 und Intellij IDEA 15. Thx.
stuchl4n3k
Nett ! Es funktioniert auch für mich, wenn ich "mvn clean install -Djavax.xml.accessExternalSchema = all" direkt auf dem Terminal unabhängig von IDE verwende
Tanorix
5

Dies funktioniert auf jdk1.8.0_65

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

Für wsimportBenutzer der ANT-Task besteht eine Möglichkeit, die von @CMFly vorgeschlagene und in der Dokumentation angegebene Option zu übergeben :

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

Es ist jetzt in der Version 2.5 behoben (veröffentlicht in jul / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Für die 2.4.x-Versionen gibt es eine Problemumgehung (wie unter https://github.com/mojohaus/jaxws-maven-plugin/issues/4 beschrieben ):

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

Ich habe es mit einem regulären Maven- Projekt verwendet und es mit dieser Plugin-Abhängigkeitskonfiguration gelöst, um Folgendes auszuführenxjc 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
quelle
Mit dieser Lösung musste ich jaxws-maven-pluginauf 2.5 aktualisieren , wie in anderen Antworten angegeben. Mojohaus.org/jaxws-maven-plugin/usage.html Aber trotzdem die beste Antwort in meinem Fall, danke!
DependencyHell
3

Erstellen Sie eine Datei mit dem Namen jaxp.properties(falls nicht vorhanden) unter dem Pfad zu Ihrer "JDK-Version / jre / lib" und fügen Sie diese Zeile hinzu:

javax.xml.accessExternalSchema = all
Gayan Mettananda
quelle
2

Eine weitere Lösung: wiki.netbeans.org

Der Webdienstclient-Assistent in der IDE analysiert die WSDL-Datei, wenn ein Webdienstclient aus einem Webdienst oder einer WSDL-Datei generiert wird. Sie müssen die IDE-Konfigurationsdatei (netbeans.conf) ändern, um den netbeans_default_options den folgenden Schalter hinzuzufügen. Sie müssen die IDE neu starten, damit die Änderung wirksam wird.

-J-Djavax.xml.accessExternalSchema=all

Bei der Bereitstellung in GlassFish müssen Sie den Zugriff auf ein externes Schema aktivieren, um einen Testclient für einen Webdienst zu generieren. Um den Zugriff zu aktivieren, müssen Sie die Konfigurationsdatei des GlassFish-Servers (GLASSFISH_INSTALL / glassfish / domain / domain1 / config / domain.xml) ändern und das folgende JVM-Optionselement hinzufügen. Sie müssen den Server neu starten, damit die Änderung wirksam wird.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Özgür Akıncı
quelle
Es tut mir leid, ich kann mir nichts anderes vorstellen.
Özgür Akıncı
1

Wenn Sie ant verwenden, können Sie Ihren Java-Aufrufen ein jvmarg hinzufügen:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
quelle
Können Sie genauer sagen, wo Sie dies in eine Ameisendatei einfügen?
John L
1

Eine sehr einfache tragbare Lösung wäre, die folgende Codezeile irgendwo in einem wichtigen Teil Ihres Codes zu platzieren, von dem Sie sicher sind, dass er ausgeführt wird (zum Beispiel direkt in der Hauptmethode):

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

Dadurch wird die erforderliche Systemeigenschaft programmgesteuert festgelegt, ohne dass schwierige Änderungen an maven pom.xml vorgenommen werden müssen (was aus irgendeinem Grund bei mir nicht funktioniert hat).

R Hoekstra
quelle
1

Ich habe gerade versucht, dass, wenn Sie Tool verwenden SoapUI (5.4.x)und verwenden Apache CXF, um Java-Code zu generieren, das Einfügen javax.xml.accessExternalSchema = allin eine YOUR_JDK/jre/lib/jaxp.propertiesDatei auch funktioniert.

TGU
quelle
0

Eine andere Alternative besteht darin, das Shell-Skript wsimport.sh zu aktualisieren, indem Folgendes hinzugefügt wird:

Die Datei wsimport.sh befindet sich in diesem Verzeichnis:

jaxws-ri.2.2.28 / bin

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

Percy Williams
quelle
Ich würde gerne Ihren Vorschlag ausprobieren, aber anscheinend befindet sich jaxws-ri.2.2.28 / bin nirgendwo auf meinem Computer.
Max West
0

Ein weiterer Hinweis: Wenn Sie das maven-jaxb2-pluginvor Version 0.9.0 verwenden, können Sie die in diesem Problem beschriebene Problemumgehung verwenden , bei der sich dieses Verhalten auf das Plugin auswirkte.

Niel de Wet
quelle