Kesalahan Generasi Klien WebService dengan JDK8

227

Saya perlu mengkonsumsi layanan web di proyek saya. Saya menggunakan NetBeans sehingga saya mengklik kanan pada proyek saya dan mencoba menambahkan "Klien Layanan Web" baru. Terakhir kali saya memeriksa, ini adalah cara untuk membuat klien layanan web. Tapi itu menghasilkan AssertionError, mengatakan:

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: Gagal membaca dokumen skema ' xjc.xsd ', karena akses 'file' tidak diperbolehkan karena pembatasan yang ditetapkan oleh properti accessExternalSchema .

Platform Java default untuk NetBeans adalah JDK8 (versi resmi Oracle), jadi ketika saya mengubah file netbeans.conf saya dan menjadikan JDK7 (dari Oracle, juga) sebagai default saya, semuanya bekerja dengan baik. Jadi saya pikir masalahnya adalah dengan JDK8. Ini java -versionoutput saya :

versi java "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 campuran)

Untuk saat ini, saya menjaga JDK7 sebagai platform Java default saya. Jika ada cara untuk membuat JDK8 berfungsi, silakan bagikan.

ab
sumber
2
Saya mengalami masalah di Eclipse bahwa sumber jaxb tidak dihasilkan saat menggunakan m2eclipse dan jdk1.8. Dalam tampilan penanda saya melihat kesalahan serupa tentang "accessExternalSchema". Ketika saya menerapkan solusi yang dipilih di bawah ini, memulai kembali gerhana dan membersihkan proyek, sumbernya dihasilkan!
Jonas Berlin

Jawaban:

403

Saya menemukan solusinya. (berdasarkan http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Buat file bernama jaxp.properties(jika tidak ada) di bawah /path/to/jdk1.8.0/jre/libdan kemudian tulis baris ini di dalamnya:

javax.xml.accessExternalSchema = all

Itu saja. Nikmati JDK 8.

ab
sumber
12
Berfungsi untuk intelliJ juga.
Mafro34
1
Saya dapat mengkonfirmasi solusi ini juga karena berfungsi untuk maven build in eclipse dengan maven dan jaxb-plugin. Adakah yang bisa menjelaskan mengapa Anda tidak membutuhkan properti ini untuk Java7?
Danny Lo
3
Ini berhasil bagi saya, tetapi saya harus meletakkan file di bawah /path/to/jdk1.8.0/libtidak di bawah jredirektori lebih lanjut .
Geoff
21
Ini tidak terlalu portabel. Anda perlu mengubah instalasi JDK lokal pada mesin dari setiap pengembang yang mencoba membangun proyek.
Natix
7
ini tidak bekerja untuk saya, berikut ini berfungsi: javax.xml.accessExternalDTD = semua, Juga saya dapat mengatur ini dalam kode dan berfungsi: System.setProperty ("javax.xml.accessExternalDTD", "all");
qartal
118

Bukan jawaban yang sebenarnya tetapi lebih sebagai referensi.

Jika Anda menggunakan plugin jaxws Maven dan Anda mendapatkan pesan kesalahan yang sama, tambahkan properti yang disebutkan ke konfigurasi 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>
jassuncao
sumber
3
The accessExternalSchema=allnilai diatur secara default jika Anda menggunakan versi (seperti 0.12.3) dari org.jvnet.jaxb2.maven2:maven-jaxb2-pluginPlugin.
Jon Onstott
Di atas tidak bekerja untuk saya. Versi ini melakukannya: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <version> $ {version.jaxws.plugin} </version> <configuration> < ! - Diperlukan dengan JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </cmonfiguration> </plugin>
Dr4gon
@ JonOnstott: memiliki 2.4.1 terbaru dan tidak berfungsi secara default. Harus menambahkan ini seperti pada jawabannya.
Robert Niestroj
36

Saya menjalankan build semut dalam Eclipse IDE (4.4, Luna, pada Windows 7 x64). Daripada memodifikasi lib JRE yang diinstal atau skrip semut apa pun (Saya memiliki beberapa proyek yang menyertakan XJC dalam pembuatannya), saya lebih suka mengubah Pengaturan Eclipse "Konfigurasi Alat Eksternal" dan menambahkan yang berikut ke argumen VM untuk konfigurasi pembangunan Ant:

-Djavax.xml.accessExternalSchema=all
gb96
sumber
2
Saya menggunakan wsdl2java.bat dari Apache CXF. Jadi saya hanya memasukkan opsi JVM ke file BAT ini. Berhasil.
ka3ak
1
Saya juga bisa menambahkan, daripada jika kita memasukkan opsi ini sebagai parameter semut, semua yang lain termasuk yang disebutkan di sini, berlebihan. Tapi tidak sebaliknya! Jadi ini solusi terbaik. +1 (tentu saja, pengguna Maven harus melakukan perubahan pada opsi Maven)
Gangnus
1
Saya memiliki masalah serupa ketika saya mencoba menjalankan instalasi mvn clean, saya baru saja menambahkan flag di atas dan berhasil dikerahkan. Terima kasih
Tombak A1
30

Karya-karya berikut untuk wsimport 2.2.9 termasuk dalam jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
tanderson
sumber
Ini bekerja untuk saya. Saya mencoba dengan jdk 1.8.0_65 dan itu tidak berhasil, jadi pastikan Anda menggunakan jdk 1.8.0_66 atau yang lebih baru.
jabe
2
Ini adalah jawaban yang benar saat menggunakan wsimportsecara langsung.
Christopher Schultz
20

Dalam kasus saya menambahkan:

javax.xml.accessExternalSchema = all

ke jaxp.properties tidak berfungsi, saya harus menambahkan:

javax.xml.accessExternalDTD = all

Lingkungan saya adalah linux mint 17 dan java 8 oracle. Saya akan meletakkannya di sana sebagai jawaban untuk orang-orang dengan masalah yang sama.

moretti.fabio
sumber
2
Itu tergantung apakah Anda ingin mengizinkan akses ke DTD eksternal atau ke XML Schema (XSD). DTD adalah pendahulu dari Skema XML. Mungkin juga ada kasus di mana Anda perlu mengatur keduanya!
Philip Helger
17

Saya menguji ini untuk versi 2.4 dari artifact org.codehaus.mojo dan itu berhasil ~

<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
sumber
1
Mungkin vmArgs -Djavax.xml.accessExternalSchema=allyang dikonfigurasi dalam deklarasi plugin Anda. Hal ini dibahas dalam Netbeans Bug 244891
kosgeinsky
15

Berikut adalah petunjuk untuk pengguna gradle tanpa hak admin: tambahkan baris ini ke tugas-jaxb Anda:

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

akan terlihat seperti ini:

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

Jika Anda mendapatkan masalah ini saat mengonversi wsdl untuk bergabung dengan cxf-codegen-plugin , maka Anda dapat menyelesaikannya dengan mengkonfigurasi plugin ke fork dan memberikan opsi "-Djavax.xml.accessExternalSchema = all" JVM tambahan.

        <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
sumber
1
Terima kasih! semua opsi di atas tidak membantu dan milik Anda bekerja untuk saya
ludenus
10

Saya juga mendapatkan jenis kesalahan yang serupa di Eclipse selama pengujian program layanan web di server 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.

Saya telah menambahkan javax.xml.accessExternalSchema = Alldijaxp.properties , tapi pekerjaan tidak mencerminkan bagi saya.

Namun saya menemukan solusi di sini di bawah ini yang berfungsi untuk saya: Untuk GlassFish Server, saya perlu memodifikasi domain.xmlGlassFish, path: <path>/glassfish/domains/domain1atau domain2/config/domain.xml) dan menambahkan, di <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>bawah <java-config>tag

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... dan kemudian restart server GlassFish

Debashish
sumber
Saya melihat dua contoh <java-config classpath-suffix…> dalam file domain.xml. Keduanya memiliki bagian <jvm-options> di dalamnya. Saya menempatkan baris di atas (dengan tag opsi-jvm) ke dalam kedua bagian. Masih tidak berfungsi untuk menjalankan Layanan Web Uji. Saya tahu proyek ini bekerja karena file klien handcoded mengakses file layanan dan mencetak info yang tepat di konsol (dari database yang terkait dengan file layanan).
Max West
<p> Saya benar-benar menutup proyek, dan proyek klien, keluar dari NetBeans dan menunggu Glassfish untuk menutup sendiri (itu menunjukkan meteran kemajuan saat sedang dimatikan). Kemudian, saya memulai kembali Netbeans, memuat kembali proyek Layanan Web, memuat kembali file Klien (itu hanya kelas Java di folder Proyek Java terpisah / reguler). Klien mencetak tabel, yang menunjukkan bahwa server dan server database berfungsi, serta layanan SOAP Web Services & EJBs. Itu tidak bekerja. Pengaturan accessExternalSchema dimakamkan di suatu tempat, dan tidak diatur dengan benar di JDK baru. </p>
Max West
7

Mengaktifkan Akses ke Skema Eksternal

Anda perlu mengaktifkan IDE dan GlassFish Server untuk mengakses skema eksternal untuk mem-parsing file WSDL dari layanan web. Untuk mengaktifkan akses Anda perlu memodifikasi file-file konfigurasi IDE dan GlassFish Server. Untuk detail lebih lanjut, lihat FAQ Cara mengaktifkan parsing WSDL dengan skema eksternal? Mengkonfigurasi IDE

Untuk menghasilkan klien layanan web di IDE dari layanan web atau file WSDL Anda perlu memodifikasi file konfigurasi IDE (netbeans.conf) untuk menambahkan switch berikut ke netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Untuk lebih lanjut tentang mencari dan memodifikasi file konfigurasi netbeans.conf, lihat FAQ Konfederasi Netbeans. Mengkonfigurasi Server GlassFish

Jika Anda menggunakan Server GlassFish Anda perlu memodifikasi file konfigurasi Server GlassFish (domain.xml) untuk memungkinkan server mengakses skema eksternal untuk mem-parsing file wsdl dan menghasilkan klien uji. Untuk mengaktifkan akses ke skema eksternal, buka file konfigurasi GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) dan tambahkan elemen opsi JVM berikut (dicetak tebal). Anda harus memulai ulang server agar perubahan diterapkan.

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

Saat menggunakan Maven dengan IntelliJ IDE, Anda dapat menambahkan -Djavax.xml.accessExternalSchema=allke pengaturan Maven di bawah Opsi JVM untuk konfigurasi Runner Runner Maven Build Tools

Dexter Legaspi
sumber
Bekerja dengan Linux Mint 17.3, JDK 1.8.0.74 dan Intellij IDEA 15. Thx.
stuchl4n3k
Bagus! itu juga berfungsi untuk saya ketika saya menggunakan "mvn clean install -Djavax.xml.accessExternalSchema = all" langsung di terminal terlepas dari IDE
Tanorix
5

Ini berfungsi pada jdk1.8.0_65

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

Bagi mereka yang menggunakan tugas ANT wsimport, cara meneruskan opsi seperti yang disarankan oleh @CMFly dan ditentukan dalam dokumentasi adalah sebagai berikut:

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

Sekarang diperbaiki dalam versi 2.5 (dirilis pada jul / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Untuk versi 2.4.x ada solusi (seperti yang dijelaskan dalam 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
sumber
3

Saya menggunakannya dengan proyek pakar reguler , dan menyelesaikannya dengan konfigurasi dependensi plugin ini untuk menjalankan 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
sumber
Dengan solusi ini, saya perlu memperbarui jaxws-maven-pluginke 2.5 sebagaimana ditentukan dalam jawaban orang lain mojohaus.org/jaxws-maven-plugin/usage.html Tapi tetap saja, jawaban terbaik dalam kasus saya, terima kasih!
DependencyHell
3

Buat file bernama jaxp.properties(jika tidak ada) di bawah path ke "JDK versi / jre / lib" dan kemudian tambahkan baris ini di dalamnya:

javax.xml.accessExternalSchema = all
Gayan Mettananda
sumber
2

Solusi lain untuk mengatasi: wiki.netbeans.org

Wisaya Klien Layanan Web di IDE mem-parsing file WSDL saat membuat klien layanan web dari layanan web atau file WSDL. Anda perlu memodifikasi file konfigurasi IDE (netbeans.conf) untuk menambahkan saklar berikut ke netbeans_default_options. Anda harus memulai ulang IDE agar perubahan diterapkan.

-J-Djavax.xml.accessExternalSchema=all

Ketika menyebarkan ke GlassFish Anda perlu mengaktifkan akses ke skema eksternal untuk menghasilkan klien uji untuk layanan web. Untuk mengaktifkan akses Anda perlu memodifikasi file konfigurasi GlassFish Server (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) dan tambahkan elemen opsi JVM berikut. Anda harus memulai ulang server agar perubahan diterapkan.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Özgür Akıncı
sumber
Maaf, saya tidak bisa memikirkan hal lain.
Özgür Akıncı
1

Jika Anda menggunakan semut, Anda dapat menambahkan jvmarg ke panggilan java Anda:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
sumber
Bisakah Anda lebih spesifik di mana Anda meletakkan ini di file semut?
John L
1

Solusi portabel yang sangat sederhana adalah, untuk menempatkan baris kode berikut di suatu tempat di bagian penting dari kode Anda, bagian di mana Anda yakin itu akan dijalankan (misalnya tepat di metode utama):

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

Ini menetapkan properti sistem yang diperlukan secara program, tanpa harus melakukan perubahan maven pom.xml yang rumit (yang karena beberapa alasan tidak berhasil bagi saya).

R Hoekstra
sumber
1

Saya baru saja mencoba bahwa jika Anda menggunakan SoapUI (5.4.x)dan menggunakan Apache CXFalat untuk menghasilkan kode java, put javax.xml.accessExternalSchema = alldi YOUR_JDK/jre/lib/jaxp.propertiesberkas juga bekerja.

TGU
sumber
0

Alternatif lain adalah memperbarui skrip shell wsimport.sh dengan menambahkan berikut ini:

Wsimport.sh terletak di direktori ini:

jaxws-ri.2.2.28 / bin

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

Percy Williams
sumber
Saya ingin mencoba saran Anda, tetapi tampaknya jaxws-ri.2.2.28 / bin tidak ada di mana pun di mesin saya.
Max West
0

Referensi lain: Jika Anda menggunakan maven-jaxb2-plugin, sebelum versi 0.9.0, Anda dapat menggunakan solusi yang dijelaskan pada masalah ini , di mana perilaku ini mempengaruhi plugin.

Niel de Wet
sumber