Błąd generowania klienta WebService z JDK8

227

Muszę skorzystać z usługi internetowej w moim projekcie. Korzystam z NetBeans, więc kliknąłem prawym przyciskiem myszy mój projekt i próbowałem dodać nowego „klienta usług sieciowych”. Ostatnim razem, gdy sprawdzałem, był to sposób na utworzenie klienta usługi internetowej. Ale to spowodowało błąd AssertionError, mówiąc:

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: Nie można odczytać dokumentu schematu „ xjc.xsd ”, ponieważ dostęp do „pliku” jest niedozwolony z powodu ograniczeń ustawionych przez właściwość accessExternalSchema .

Domyślną platformą Java dla NetBeans był JDK8 (oficjalna wersja Oracle), więc kiedy zmieniłem mój plik netbeans.conf i ustawiłem JDK7 (również z Oracle) jako moją domyślną, wszystko działało dobrze. Myślę więc, że problem dotyczy JDK8. Oto mój java -versionwynik:

Wersja Java „1.8.0”
Środowisko wykonawcze Java (TM) SE (kompilacja 1.8.0-b132
) 64-bitowa maszyna wirtualna serwera Java HotSpot (TM) (kompilacja 25.0-b70, tryb mieszany)

Na razie zachowuję JDK7 jako moją domyślną platformę Java. Jeśli istnieje sposób, aby JDK8 działał, udostępnij.

ab
źródło
2
W środowisku Eclipse napotkałem problem polegający na tym, że źródła JavaX nie były generowane podczas korzystania z m2eclipse i jdk1.8. W widoku znaczników widziałem podobny błąd dotyczący „accessExternalSchema”. Kiedy zastosowałem wybrane rozwiązanie poniżej, ponownie uruchomiłem zaćmienie i wyczyściłem projekt, źródła zostały wygenerowane!
Jonas Berlin

Odpowiedzi:

403

Znalazłem rozwiązanie. (na podstawie http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Utwórz plik o nazwie jaxp.properties(jeśli nie istnieje) pod, /path/to/jdk1.8.0/jre/liba następnie zapisz w nim ten wiersz:

javax.xml.accessExternalSchema = all

To wszystko. Ciesz się JDK 8.

ab
źródło
12
Działa również dla intelliJ.
Mafro34
1
Mogę potwierdzić to rozwiązanie również jako działające dla maven build w zaćmieniu z maven i wtyczką jaxb. Czy ktoś może wyjaśnić, dlaczego nie potrzebujesz tej właściwości dla Java7?
Danny Lo
3
To działało dla mnie, ale musiałem umieścić plik w /path/to/jdk1.8.0/libinnym jrekatalogu.
Geoff,
21
To nie jest bardzo przenośne. Będziesz musiał dostosować lokalną instalację JDK na komputerze każdego programisty, który próbuje zbudować projekt.
Natix
7
to nie działa dla mnie, działały następujące: javax.xml.accessExternalDTD = wszystkie, Mogę również ustawić to w kodzie i działa: System.setProperty („javax.xml.accessExternalDTD”, „wszystkie”);
qartal
118

Nie rzeczywista odpowiedź, ale raczej jako odniesienie.

Jeśli korzystasz z wtyczki Javenws Maven i pojawia się ten sam komunikat o błędzie, dodaj wspomnianą właściwość do konfiguracji wtyczki:

...
<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
źródło
3
accessExternalSchema=allWartość jest ustawiona domyślnie, jeśli używasz nowsze wersje (jak 0.12.3) z org.jvnet.jaxb2.maven2:maven-jaxb2-pluginwtyczką.
Jon Onstott
Powyższe nie działało dla mnie. Ta wersja miała: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <wersja> $ {version.jaxws.plugin} </version> <konfiguracja> < ! - Potrzebne z JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon
@JonOnstott: mają najnowszą wersję 2.4.1 i domyślnie nie działa. Musiałem dodać to jak w odpowiedzi.
Robert Niestroj
36

Uruchamiam kompilacje mrówek w środowisku Eclipse IDE (4.4, Luna, na Windows 7 x64). Zamiast modyfikować zainstalowane biblioteki JRE lub jakiekolwiek skrypty Ant (mam wiele projektów, które zawierają XJC w swoich kompilacjach), wolę zmienić Ustawienia Eclipse „Konfiguracje narzędzi zewnętrznych” i dodać następujące argumenty do argumentów VM dla konfiguracji kompilacji Ant:

-Djavax.xml.accessExternalSchema=all
gb96
źródło
2
Używam wsdl2java.bat z Apache CXF. Właśnie wstawiłem opcję JVM do tego pliku BAT. To działa.
ka3ak,
1
Mógłbym również dodać, że jeśli uwzględnimy tę opcję jako parametr mrówki, wszystkie inne wymienione tutaj włączenia są nadmierne. Ale nie odwrotnie! To jest najlepsze rozwiązanie. +1 (oczywiście użytkownicy Maven powinni dokonać odpowiednich zmian w opcjach Maven)
Gangnus
1
Miałem podobny problem, kiedy próbowałem uruchomić czystą instalację mvn, właśnie dodałem tę powyższą flagę i udało się ją pomyślnie wdrożyć. Dzięki
Spear A1,
30

Następujące prace dla wsimport 2.2.9 zawarte w jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
tanderson
źródło
To działa dla mnie. Próbowałem z jdk 1.8.0_65 i to nie działało, więc upewnij się, że używasz jdk 1.8.0_66 lub nowszej.
jabe
2
To jest poprawna odpowiedź przy wsimportbezpośrednim użyciu .
Christopher Schultz
20

W moim przypadku dodanie:

javax.xml.accessExternalSchema = all

do jaxp.properties nie działało, muszę dodać:

javax.xml.accessExternalDTD = all

Moje środowisko to linux mint 17 i java 8 oracle. Przedstawię to jako odpowiedź dla osób z tym samym problemem.

moretti.fabio
źródło
2
To zależy, czy chcesz zezwolić na dostęp do zewnętrznego DTD, czy do schematu XML (XSD). DTD jest poprzednikiem schematu XML. Mogą również wystąpić przypadki, w których musisz ustawić oba!
Philip Helger
17

Przetestowałem to dla wersji 2.4 artefaktu org.codehaus.mojo i działało ~

<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
źródło
1
Być może to vmArgs -Djavax.xml.accessExternalSchema=alljest skonfigurowany w deklaracji wtyczki. Jest to omówione w Netbeans Bug 244891
kosgeinsky
15

Oto wskazówka Wskazówka dla stopniowych użytkowników bez uprawnień administratora: dodaj tę linię do zadania jaxb:

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

będzie to wyglądać tak:

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

Jeśli ten problem występuje podczas konwertowania wsdl do jave za pomocą wtyczki cxf-codegen , możesz go rozwiązać, konfigurując wtyczkę do rozwidlenia i udostępniając dodatkową opcję JVM „-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>
pjklauser
źródło
1
dzięki! wszystkie powyższe opcje nie pomagają i twoja działa dla mnie
ludenus
10

Otrzymałem również podobny typ błędu w Eclipse podczas testowania programu webservice na serwerze 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.

Dodałem javax.xml.accessExternalSchema = Allwjaxp.properties , ale praca doesnot dla mnie.

Jednak znalazłem tutaj rozwiązanie, które działa dla mnie: W przypadku GlassFish Server muszę zmodyfikować domain.xmlGlassFish, ścieżka: <path>/glassfish/domains/domain1lub domain2/config/domain.xml) i dodać <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>pod <java-config>tagiem

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... a następnie ponownie uruchom serwer GlassFish

Debashish
źródło
Widzę dwa wystąpienia <java-config classpath-sufiks…> w pliku domain.xml. Oba mają w sobie sekcje <jvm-options>. Umieściłem linię powyżej (z tagami jvm-options) w obu sekcjach. Nadal nie działa testowanie usługi sieci Web. Wiem, że projekt działa, ponieważ ręcznie zakodowany plik klienta uzyskuje dostęp do plików usługi i drukuje odpowiednie informacje w konsoli (z bazy danych powiązanej z plikami usług).
Max West
<p> Zamknąłem projekt, a projekt klienta opuściłem NetBeans i czekałem, aż Glassfish się zamknie (pokazuje wskaźnik postępu podczas zamykania). Następnie zrestartowałem Netbeans, ponownie załadowałem projekt Web Services, ponownie załadowałem plik klienta (to tylko klasa Java w osobnym / regularnym folderze Java Project). Klient drukuje tabele, które pokazują, że serwer i serwer bazy danych działają, a także usługi sieciowe SOAP i komponenty EJB. To po prostu nie działa. Ustawienie accessExternalSchema jest gdzieś zakopane i nie jest poprawnie ustawiane w nowym JDK. </p>
Max West
7

Włączanie dostępu do schematu zewnętrznego

Musisz włączyć IDE i serwer GlassFish, aby uzyskać dostęp do zewnętrznego schematu w celu parsowania pliku WSDL usługi internetowej. Aby umożliwić dostęp, musisz zmodyfikować pliki konfiguracyjne IDE i GlassFish Server. Aby uzyskać więcej informacji, zobacz często zadawane pytania Jak włączyć parsowanie WSDL za pomocą zewnętrznego schematu? Konfigurowanie IDE

Aby wygenerować klienta usług WWW w IDE z usługi internetowej lub pliku WSDL, należy zmodyfikować plik konfiguracyjny IDE (netbeans.conf), aby dodać następujący przełącznik do opcji netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Aby uzyskać więcej informacji na temat lokalizowania i modyfikowania pliku konfiguracyjnego netbeans.conf, zobacz Często zadawane pytania dotyczące Conf Netbeans. Konfigurowanie serwera GlassFish

W przypadku wdrażania na serwerze GlassFish należy zmodyfikować plik konfiguracyjny serwera GlassFish (domain.xml), aby umożliwić serwerowi dostęp do schematów zewnętrznych w celu analizy pliku WSDL i wygenerowania klienta testowego. Aby umożliwić dostęp do schematów zewnętrznych, otwórz plik konfiguracyjny GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) i dodaj następujący element opcji JVM (pogrubiony). Konieczne będzie zrestartowanie serwera, aby zmiana zaczęła obowiązywać.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Ashwin Patil
źródło
6

Korzystając z Maven z IntelliJ IDE, możesz dodać -Djavax.xml.accessExternalSchema=allustawienie Maven w Opcjach JVM dla konfiguracji narzędzia Run Maven Build Tools

Dexter Legaspi
źródło
Współpracuje z Linux Mint 17.3, JDK 1.8.0.74 i Intellij IDEA 15. Thx.
stuchl4n3k
Miły ! działa również dla mnie, gdy używam „mvn clean install -Djavax.xml.accessExternalSchema = all” bezpośrednio na terminalu niezależnie od IDE
Tanorix
5

Działa to na jdk1.8.0_65

wsimport -J-Djavax.xml.accessExternalSchema=all -keep -verbose https://your webservice url?wsdl
Stephen
źródło
4

Dla tych, którzy korzystają z zadania ANT wsimport, sposób przekazania opcji sugerowany przez @CMFly i określony w dokumentacji jest następujący:

<wsimport
   <!-- ... -->
   fork="true"
  >
  <jvmarg value="-Djavax.xml.accessExternalSchema=all"/>
</wsimport>
Daniele Piccioni
źródło
4

Zostało to naprawione w wersji 2.5 (wydanej w lipcu / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

W przypadku wersji 2.4.x istnieje obejście (jak opisano w 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
źródło
3

Użyłem go ze zwykłym projektem maven i rozwiązałem go dzięki tej konfiguracji zależności wtyczki do uruchamiania 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
źródło
Dzięki temu rozwiązaniu musiałem zaktualizować jaxws-maven-plugindo wersji 2.5, jak podano w innych odpowiedziach mojohaus.org/jaxws-maven-plugin/usage.html Ale nadal najlepsza odpowiedź w moim przypadku, dziękuję!
DependencyHell
3

Utwórz plik o nazwie jaxp.properties(jeśli nie istnieje) pod ścieżką do „wersji JDK / jre / lib”, a następnie dodaj w nim następujący wiersz:

javax.xml.accessExternalSchema = all
Gayan Mettananda
źródło
2

Inne rozwiązanie do rozwiązania: wiki.netbeans.org

Kreator klienta usług WWW w IDE analizuje plik WSDL podczas generowania klienta usług WWW z usługi internetowej lub pliku WSDL. Musisz zmodyfikować plik konfiguracyjny IDE (netbeans.conf), aby dodać następujący przełącznik do opcji netbeans_default_options. Konieczne będzie ponowne uruchomienie IDE, aby zmiana zaczęła obowiązywać.

-J-Djavax.xml.accessExternalSchema=all

Podczas wdrażania w GlassFish musisz włączyć dostęp do schematu zewnętrznego, aby wygenerować klienta testowego dla usługi sieciowej. Aby umożliwić dostęp, musisz zmodyfikować plik konfiguracyjny serwera GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) i dodać następujący element opcji JVM. Konieczne będzie zrestartowanie serwera, aby zmiana zaczęła obowiązywać.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Özgür Akıncı
źródło
Przepraszam, nie mogę myśleć o niczym innym.
Özgür Akıncı
1

Jeśli używasz ant, możesz dodać jvmarg do swoich wywołań Java:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
źródło
Czy możesz być bardziej szczegółowy, gdzie umieścisz to w pliku mrówki?
John L,
1

Bardzo prostym przenośnym rozwiązaniem byłoby umieszczenie następującego wiersza kodu gdzieś w kluczowej części kodu, którego część jesteś pewien, że zostanie on uruchomiony (na przykład bezpośrednio w metodzie głównej):

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

To ustawia potrzebną właściwość systemową programowo, bez konieczności wprowadzania skomplikowanych zmian pom.xml maven (co z jakiegoś powodu nie działało dla mnie).

R Hoekstra
źródło
1

Właśnie próbowałem, że jeśli używasz SoapUI (5.4.x)i użycie Apache CXFnarzędzia do generowania kodu java, umieścić javax.xml.accessExternalSchema = allw YOUR_JDK/jre/lib/jaxp.propertiespliku działa również.

TGU
źródło
0

Inną alternatywą jest aktualizacja skryptu powłoki wsimport.sh poprzez dodanie następujących elementów:

Plik wsimport.sh znajduje się w tym katalogu:

jaxws-ri.2.2.28 / bin

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

Percy Williams
źródło
Chciałbym wypróbować twoją sugestię, ale najwyraźniej jaxws-ri.2.2.28 / bin nie ma nigdzie na mojej maszynie.
Max West
0

Inne odniesienie: Jeśli korzystasz z maven-jaxb2-pluginwersji wcześniejszej niż 0.9.0, możesz skorzystać z obejścia opisanego w tym problemie , w którym to zachowanie wpłynęło na wtyczkę.

Niel de Wet
źródło