Domanda

Ho bisogno di consumare un servizio Web nel mio progetto. Io uso NetBeans, quindi ho fatto clic con il pulsante destro del mouse sul mio progetto e ho provato ad aggiungere un nuovo "client di servizio Web". L'ultima volta che ho controllato, questo è stato il modo di creare un client di servizi Web. Ma ha provocato un asserzionerror, 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; Numero di colonne: 88; Schema_Reference: Impossibile leggere il documento dello schema ' XJC.xsd ', poiché l'accesso 'file' non è consentito a causa della restrizione impostata da AccessExternalsschema Proprietà.

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

.

Versione Java "1.8.0"
Java (TM) SE Ambiente runtime (Build 1.8.0-B132)
Java Hotspot (TM) Server a 64 bit VM (Build 25.0-B70, modalità misto)

Per ora, sto mantenendo JDK7 come la mia piattaforma Java predefinita. Se c'è un modo per rendere il lavoro JDK8, per favore condividi.

È stato utile?

Soluzione

Bene, ho trovato la soluzione.(Basato su http://docs.oracle.COM / JAVASE / 7 / DOCS / API / JAVAX / XML / XMLCONSTANTS.HTML # access_external_schema )

Creare un file denominato jaxp.properties (se non esiste) sotto /path/to/jdk1.8.0/jre/lib e quindi scrivi questa linea:

javax.xml.accessExternalSchema = all
.

Questo è tutto.Goditi JDK 8.

Altri suggerimenti

Non una risposta effettiva ma più come riferimento.

Se si utilizza il plugin JaxWS Maven e si ottiene lo stesso messaggio di errore, aggiungi 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>
.

Gestisco formica Builds all'interno di Eclipse IDE (4.4, Luna, su Windows 7 X64).Piuttosto che modificare i jre lib installati o qualsiasi tipo di script (ho progetti multipli che includono XJC nelle loro build), preferisco modificare le impostazioni Eclipse "Configurazioni strumenti esterne" e aggiungere quanto segue per gli argomenti VM per la configurazione Build ANT: .

-Djavax.xml.accessExternalSchema=all
.

I seguenti lavori per Wsimport 2.2.9 inclusi in JDK 1.8.0_66:

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

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 metterò lì come risposta per le persone con lo stesso problema.

Ho testato questo per la versione 2.4 di artefatto org.codehaus.mojo e che funzionasse ~

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

Ecco un suggerimento per i suggerimenti per gli utenti Gradle senza diritti di amministratore: aggiungi questa linea al tuo JaxB-Task:

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

Sembrerà questo:

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

Se si ottiene questo problema quando si converti il WSDL in Jave con CXF-Codegen-Plugin , quindi è possibile risolverlo configurando il plugin alla forcella e fornire il "-djavax.xml.accessexterternalschema= all" Jvmopzione.

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

Mi stava anche ricevendo un tipo simile di errore nell'eclipse durante il test di un programma WebService su GlassFish 4.0 server Web: 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 = All in jaxp.properties, ma non funziona per me.

Comunque ho trovato una soluzione qui sotto quale funziona per me: Per il server Glassfish, ho bisogno di modificare il domain.xml dei Glassfish, Path: <path>/glassfish/domains/domain1 o domain2/config/domain.xml) e aggiungi, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>under il tag <java-config>

....
.

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

Quando si utilizza MAVEN con Intellij IDE è possibile aggiungere -Djavax.xml.accessExternalSchema=all a Maven impostazione in Opzioni JVM per Configurazione del runner Strumenti di Build Maven

Abilitazione dell'accesso allo schema esterno

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

Per generare un client di servizio Web nell'IDE da un file Web o in un file WSDL è necessario modificare il file di configurazione IDE (NetBeans.Conf) per aggiungere il seguente interruttore a NetBeans_Default_options.

-J-Djavax.xml.accessExternalSchema=all
.

Per ulteriori informazioni sulla localizzazione e la modifica del file di configurazione NetBeans.conf, vedere NetBeans Conf FAQ. Configurazione del server GlassFish

Se si sta distribuendo sul server GlassFish è necessario modificare il file di configurazione del GlassFish Server (Domain.xml) per abilitare il server di accedere agli schemi esterni per analizzare il file WSDL e generare il client di test. Per abilitare l'accesso a schemi esterni, aprire il file di configurazione di GlassFish (GlassFish_Install / GlassFish / Domains / Domain1 / Config / Domain.xml) e aggiungere il seguente elemento di opzione JVM (in grassetto). Avrai bisogno di riavviare il server per la modifica per avere effetto.

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

Per coloro che utilizzano il compito ant wsimport, un modo per passare l'opzione come suggerito da @cmfly e specificato in Documentazione è il seguente:

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

L'ho usato con un progetto Maven regolare, e l'ho risolto con questa configurazione di dipendenza da plugin per l'esecuzione del 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>
.

funziona su jdk1.8.0_65

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

È ora fissato in versione 2.5 (rilasciata in lug / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Per le versioni 2.4.x c'è una soluzione alternativa (come ha rifilato 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>
.

Se stai usando la formica puoi aggiungere un JVMARG alle chiamate Java:

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

Una soluzione portatile molto semplice sarebbe, per posizionare la seguente riga di codice da qualche parte in una parte cruciale del tuo codice, una parte di cui sei sicuro che sarà eseguito (ad esempio direttamente nel metodo principale): .

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

Imposta la proprietà del sistema necessaria a livello di programmazione, senza dover fare modifiche ingannevoli Pom.xml (che per qualche motivo non ha funzionato per me).

Ho appena provato che se si utilizza SoapUI (5.4.x) e utilizza lo strumento Apache CXF per generare codice Java, inserire javax.xml.accessExternalSchema = all nel file YOUR_JDK/jre/lib/jaxp.properties funziona anche.

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

Il wsimport.sh si trova in questa directory:

JAXWS-RI.2.2.28 / BIN

exec "$ java" $ wsimport_opts -djavax.xml.accessesternalschema= all -jar "$ jaxws_home / lib / jaxws-tools.jar" "$ @"

Un altro riferimento: Se si utilizza maven-jaxb2-plugin, prima della versione 0.9.0, è possibile utilizzare la soluzione alternativa descritta su questo tema, in cui questo comportamento ha influenzato il plugin.

Netbeans Aggiorna il loro tutorial per JDK8 e questo problema:

Guida introduttiva con JAX-WS Servizi Web -> Abilitando l'accesso all'esternoSchema

Creare un file denominato jaxp.properties (se non esiste) sotto Path to Your "JDK versione / jre / lib" e quindi aggiungere questa linea in esso:

javax.xml.accessExternalSchema = all
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top