Errore di generazione client WebService con JDK8


227

Devo consumare un servizio web nel mio progetto. Uso NetBeans, quindi ho cliccato con il tasto destro sul mio progetto e ho provato ad aggiungere un nuovo "Web Service Client". L'ultima volta che ho controllato, questo era il modo di creare un client di servizi web. Ma ha provocato un errore di asserzione, dicendo:

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: impossibile leggere il documento dello schema ' xjc.xsd ', perché l'accesso a 'file' non è consentito a causa della restrizione impostata dalla proprietà accessExternalSchema .

La piattaforma Java predefinita per NetBeans era JDK8 (la versione ufficiale di Oracle), quindi quando ho cambiato il mio file netbeans.conf e reso JDK7 (anche da Oracle) come predefinito, tutto ha funzionato bene. Quindi penso che il problema sia con JDK8. Ecco il mio java -versionoutput:

versione java "1.8.0"
Java (TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot (TM) VM a 64 bit Server (build 25.0-b70, modalità mista)

Per ora, sto mantenendo JDK7 come la mia piattaforma Java predefinita. Se c'è un modo per far funzionare JDK8, ti preghiamo di condividere.


2
Ho riscontrato un problema in Eclipse che le fonti jaxb non sono state generate durante l'utilizzo di m2eclipse e jdk1.8. Nella vista dei marker ho visto un errore simile su "accessExternalSchema". Quando ho applicato la soluzione scelta di seguito, riavviato l'eclissi e ripulito il progetto, le fonti sono state generate!
Jonas Berlin,

Risposte:


403

Bene, ho trovato la soluzione. (basato su http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Crea un file chiamato jaxp.properties(se non esiste) sotto /path/to/jdk1.8.0/jre/libe quindi scrivi questa riga in esso:

javax.xml.accessExternalSchema = all

È tutto. Divertiti con JDK 8.


12
Funziona anche per IntelliJ.
Mafro34,

1
Posso confermare questa soluzione anche lavorando con maven build in eclipse con maven e jaxb-plugin. Qualcuno può spiegare perché non hai bisogno di questa proprietà per Java7?
Danny Lo,

3
Questo ha funzionato per me, ma ho dovuto mettere il file /path/to/jdk1.8.0/libnon sotto la jredirectory successiva .
Geoff

21
Questo non è molto portatile. Dovresti modificare un'installazione JDK locale su una macchina di ogni sviluppatore che tenta di costruire il progetto.
Natix,

7
questo non funziona per me, il seguente ha funzionato: javax.xml.accessExternalDTD = all, inoltre posso impostare questo nel codice e funziona: System.setProperty ("javax.xml.accessExternalDTD", "all");
Qartal,

118

Non una risposta reale ma più come riferimento.

Se si utilizza il plug-in Maven di jaxws e viene visualizzato lo stesso messaggio di errore, aggiungere la proprietà menzionata alla configurazione del 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>

3
Il accessExternalSchema=allvalore è impostato di default se si utilizzano versioni successive (come 0.12.3) del org.jvnet.jaxb2.maven2:maven-jaxb2-pluginplug-in.
Jon Onstott,

Quanto sopra non ha funzionato per me. Questa versione ha fatto: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <version> $ {version.jaxws.plugin} </version> <configurazione> < ! - Necessario con JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon

@JonOnstott: hanno l'ultimo 2.4.1 e non funziona di default. Ho dovuto aggiungere questo come nella risposta.
Robert Niestroj,

36

Corro build di formiche all'interno di Eclipse IDE (4.4, Luna, su Windows 7 x64). Piuttosto che modificare la lib JRE installata o qualsiasi script ant (ho più progetti che includono XJC nelle loro build), preferisco cambiare le "Configurazioni di strumenti esterni" delle Impostazioni Eclipse e aggiungere quanto segue agli argomenti VM per la configurazione della build Ant:

-Djavax.xml.accessExternalSchema=all

2
Uso wsdl2java.bat da Apache CXF. Quindi ho appena inserito l'opzione JVM in questo file BAT. Funziona.
Ka3ak,

1
Potrei anche aggiungere che se includiamo questa opzione come parametro ant, tutte le altre include menzionate qui sono eccessive. Ma non viceversa! Quindi questa è la soluzione migliore. +1 (ovviamente, gli utenti di Maven dovrebbero fare le opportune modifiche nelle opzioni di Maven)
Gangnus,

1
Ho avuto un problema simile quando ho provato a eseguire mvn clean install, ho appena aggiunto questo flag sopra ed è stato distribuito correttamente. Grazie
Spear A1,

30

Quanto segue funziona per wsimport 2.2.9 incluso in jdk 1.8.0_66:

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

Questo funziona per me. Ho provato con jdk 1.8.0_65 e non ha funzionato, quindi assicurati di utilizzare jdk 1.8.0_66 o successivo.
jabe,

2
Questa è la risposta corretta quando si utilizza wsimportdirettamente.
Christopher Schultz,

20

Nel mio caso aggiungendo:

javax.xml.accessExternalSchema = all

a jaxp.properties non ha funzionato, devo aggiungere:

javax.xml.accessExternalDTD = all

Il mio ambiente è Linux mint 17 e Java 8 Oracle. Lo inserirò come una risposta per le persone con lo stesso problema.


2
Dipende se si desidera consentire l'accesso al DTD esterno o allo schema XML (XSD). DTD è il predecessore di XML Schema. Potrebbero esserci anche casi in cui è necessario impostare entrambi!
Philip Helger,

17

Ho provato questo per la versione 2.4 di artefatto org.codehaus.mojo e ha funzionato ~

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

1
Forse è il vmArgs -Djavax.xml.accessExternalSchema=allche è configurato nella dichiarazione del plugin. È discusso in Netbeans Bug 244891
kosgeinsky

15

Ecco un suggerimento Suggerimento per gli utenti di livello senza diritti di amministratore: aggiungi questa riga al tuo compito jaxb:

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

sarà simile a questo:

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

12

Se stai riscontrando questo problema quando converti wsdl in jave con il plug-in cxf-codegen , puoi risolverlo configurando il plug-in su fork e fornendo l'opzione JVM aggiuntiva "-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>

1
Grazie! tutte le opzioni di cui sopra non aiutano e la tua sta lavorando per me
ludenus

10

Inoltre stavo ottenendo un simile tipo di errore in Eclipse durante il test di un programma di webservice sul 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.

Ho aggiunto javax.xml.accessExternalSchema = Allin jaxp.properties, ma il lavoro doesnot per me.

Comunque ho trovato una soluzione qui sotto che funziona per me: per GlassFish Server, devo modificare domain.xmlGlassFish, percorso: <path>/glassfish/domains/domain1o domain2/config/domain.xml) e aggiungere, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>sotto il <java-config>tag

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... e quindi riavviare il server GlassFish


Vedo due istanze di <java-config classpath-suffix ...> nel file domain.xml. Entrambi hanno sezioni di <jvm-options> al loro interno. Ho inserito la linea sopra (con i tag jvm-options) in entrambe le sezioni. Non funziona ancora per eseguire il servizio Web di prova. So che il progetto sta funzionando perché il file client codificato a mano accede ai file di servizio e stampa le informazioni giuste nella console (dal database associato ai file di servizio).
Max West,

<p> Ho chiuso il progetto e il progetto client è uscito da NetBeans e ho aspettato che Glassfish si chiudesse da solo (mostra un indicatore di avanzamento mentre si sta spegnendo). Quindi, ho riavviato Netbeans, ricaricato il progetto Web Services, ricaricato il file Client (è solo una classe Java in una cartella separata / normale del Progetto Java). Il client stampa le tabelle, a dimostrazione del funzionamento del server e del server di database, nonché dei servizi Web EJB del servizio SOAP. Semplicemente non funziona. L'impostazione accessExternalSchema è sepolta da qualche parte e non viene impostata correttamente nel nuovo JDK. </p>
Max West,

7

Abilitazione dell'accesso allo schema esterno

È necessario abilitare l'IDE e il server GlassFish per accedere allo schema esterno per analizzare il file WSDL del servizio Web. Per abilitare l'accesso è necessario modificare i file di configurazione dell'IDE e del GlassFish Server. Per maggiori dettagli, vedere le FAQ Come abilitare l'analisi di WSDL con uno schema esterno? Configurazione dell'IDE

Per generare un client del servizio Web nell'IDE da un servizio Web o dal file WSDL, è necessario modificare il file di configurazione IDE (netbeans.conf) per aggiungere il seguente parametro a netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Per ulteriori informazioni sull'individuazione e la modifica del file di configurazione netbeans.conf, vedere Domande frequenti su Netbeans Conf. Configurazione del server GlassFish

Se si esegue la distribuzione sul server GlassFish, è necessario modificare il file di configurazione del server GlassFish (domain.xml) per consentire al server di accedere a schemi esterni per analizzare il file wsdl e generare il client di prova. Per abilitare l'accesso a schemi esterni, aprire il file di configurazione GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) e aggiungere il seguente elemento opzione JVM (in grassetto). Sarà necessario riavviare il server per rendere effettive le modifiche.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>

6

Quando si utilizza Maven con IntelliJ IDE è possibile aggiungere -Djavax.xml.accessExternalSchema=allalle impostazioni Maven in Opzioni JVM per la configurazione di Maven Build Tools Runner


Funziona con Linux Mint 17.3, JDK 1.8.0.74 e Intellij IDEA 15. Thx.
stuchl4n3k,

Bello ! funziona anche per me quando uso "mvn clean install -Djavax.xml.accessExternalSchema = all" direttamente sul terminale indipendentemente dall'IDE
Tanorix

5

Funziona su jdk1.8.0_65

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

4

Per coloro che utilizzano l'attività ANT wsimport, un modo per passare l'opzione come suggerito da @CMFly e specificato nella documentazione è il seguente:

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

4

Ora è stato risolto nella versione 2.5 (rilasciata in luglio / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Per le versioni 2.4.x esiste una soluzione alternativa (come descritto in 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>

3

L'ho usato con un normale progetto maven e l'ho risolto con questa configurazione di dipendenza del plugin per l'esecuzione di 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>

Con questa soluzione, dovevo aggiornare jaxws-maven-pluginalla 2.5 come specificato nelle altre risposte mojohaus.org/jaxws-maven-plugin/usage.html Ma, risposta migliore nel mio caso, grazie!
Dipendenza

3

Crea un file chiamato jaxp.properties(se non esiste) sotto il percorso della tua "versione JDK / jre / lib" e quindi aggiungi questa riga:

javax.xml.accessExternalSchema = all

2

Un'altra soluzione da affrontare: wiki.netbeans.org

La procedura guidata Client del servizio Web nell'IDE analizza il file WSDL durante la generazione di un client del servizio Web da un servizio Web o file WSDL. È necessario modificare il file di configurazione IDE (netbeans.conf) per aggiungere la seguente opzione a netbeans_default_options. Sarà necessario riavviare l'IDE affinché le modifiche abbiano effetto.

-J-Djavax.xml.accessExternalSchema=all

Durante la distribuzione su GlassFish è necessario abilitare l'accesso allo schema esterno per generare un client di prova per un servizio Web. Per abilitare l'accesso è necessario modificare il file di configurazione di GlassFish Server (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) e aggiungere il seguente elemento opzione JVM. Sarà necessario riavviare il server per rendere effettive le modifiche.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>

Mi dispiace, non posso pensare ad altro.
Özgür Akıncı,

1

Se stai usando la formica puoi aggiungere un jvmarg alle tue chiamate java:

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

Puoi essere più specifico dove lo metti in un file formica?
John L

1

Una soluzione portatile molto semplice sarebbe quella di posizionare la seguente riga di codice da qualche parte in una parte cruciale del codice, una parte della quale si è certi che verrà eseguita (ad esempio proprio nel metodo principale):

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

Questo imposta la proprietà di sistema necessaria a livello di codice, senza dover apportare modifiche pom.xml maven difficili (che per qualche motivo non ha funzionato per me).


1

Ho appena provato che se si utilizza SoapUI (5.4.x)e uso Apache CXFstrumento per generare codice Java, messo javax.xml.accessExternalSchema = allin YOUR_JDK/jre/lib/jaxp.propertiesfile funziona anche.


0

Un'altra alternativa è aggiornare lo script della shell wsimport.sh aggiungendo quanto segue:

Wsimport.sh si trova in questa directory:

jaxws-ri.2.2.28 / bin

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


Mi piacerebbe provare il tuo suggerimento, ma a quanto pare jaxws-ri.2.2.28 / bin non è da nessuna parte sulla mia macchina.
Max West,

0

Un altro riferimento: se si utilizza la maven-jaxb2-pluginversione precedente alla 0.9.0, è possibile utilizzare la soluzione alternativa descritta in questo problema , in cui questo comportamento ha influito sul plug-in.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.