Erro de geração do cliente WebService com JDK8

227

Preciso consumir um serviço da web no meu projeto. Como uso o NetBeans, cliquei com o botão direito do mouse no meu projeto e tentei adicionar um novo "Web Service Client". Na última vez que verifiquei, era assim que se criava um cliente de serviço da web. Mas resultou em um AssertionError, dizendo:

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: falha ao ler o documento do esquema ' xjc.xsd ', porque o acesso ao 'arquivo' não é permitido devido a restrições definidas pela propriedade accessExternalSchema .

A plataforma Java padrão para o NetBeans era o JDK8 (versão oficial da Oracle); portanto, quando mudei meu arquivo netbeans.conf e criei o JDK7 (também da Oracle) como padrão, tudo funcionou bem. Então, acho que o problema está no JDK8. Aqui está a minha java -versionsaída:

versão java "1.8.0"
Java (TM) SE Runtime Environment (versão 1.8.0-b132)
VM do servidor Java HotSpot (TM) de 64 bits (versão 25.0-b70, modo misto)

Por enquanto, estou mantendo o JDK7 como minha plataforma Java padrão. Se houver uma maneira de fazer o JDK8 funcionar, compartilhe.

ab
fonte
2
Ocorreu um problema no Eclipse que as fontes jaxb não foram geradas ao usar m2eclipse e jdk1.8. Na exibição de marcadores, vi um erro semelhante sobre "accessExternalSchema". Quando apliquei a solução escolhida abaixo, reiniciei o eclipse e limpei o projeto, as fontes foram geradas!
Jonas Berlin

Respostas:

403

Bem, eu encontrei a solução. (com base em http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#ACCESS_EXTERNAL_SCHEMA )

Crie um arquivo chamado jaxp.properties(se não existir) abaixo /path/to/jdk1.8.0/jre/libe escreva esta linha nele:

javax.xml.accessExternalSchema = all

Isso é tudo. Aproveite o JDK 8.

ab
fonte
12
Também funciona para a inteligência.
Mafro34
1
Posso confirmar esta solução também como trabalhando para a construção do maven no eclipse com o maven e o jaxb-plugin. Alguém pode explicar por que você não precisa dessa propriedade para Java7?
Danny Lo
3
Isso funcionou para mim, mas tive que colocar o arquivo em /path/to/jdk1.8.0/libum jrediretório não posterior .
Geoff
21
Isso não é muito portátil. Você precisaria ajustar uma instalação local do JDK em uma máquina de todos os desenvolvedores que tentam construir o projeto.
Natix
7
isso não está funcionando para mim, o seguinte funcionou: javax.xml.accessExternalDTD = all, também posso definir isso no código e funciona: System.setProperty ("javax.xml.accessExternalDTD", "all");
Qartal 19/07
118

Não é uma resposta real, mas mais como uma referência.

Se você estiver usando o plugin jaxws Maven e receber a mesma mensagem de erro, adicione a propriedade mencionada à configuração do 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
fonte
3
O accessExternalSchema=allvalor é definido por padrão se você usar versões posteriores (como 0.12.3) do org.jvnet.jaxb2.maven2:maven-jaxb2-pluginplug - in.
Jon Onstott 27/05
O exposto acima não funcionou para mim. Esta versão fez: <plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> jaxws-maven-plugin </artifactId> <versão> $ {version.jaxws.plugin} </version> <configuração> < ! - Necessário com JAXP 1.5 -> <vmArgs> <vmArg> -Djavax.xml.accessExternalSchema = all </vmArg> </vmArgs> </configuration> </plugin>
Dr4gon
@ JonOnstott: possui o 2.4.1 mais recente e não está funcionando por padrão. Tinha que adicionar isso como na resposta.
Robert Niestroj
36

Executo construções de formigas no IDE Eclipse (4.4, Luna, no Windows 7 x64). Em vez de modificar a lib JRE instalada ou qualquer script ant (eu tenho vários projetos que incluem XJC em suas construções), prefiro alterar as Configurações do Eclipse "External Tools Configurations" e adicionar o seguinte aos argumentos da VM para a configuração de construção Ant:

-Djavax.xml.accessExternalSchema=all
gb96
fonte
2
Eu uso o wsdl2java.bat do Apache CXF. Acabei de inserir a opção JVM neste arquivo BAT. Funciona.
ka3ak
1
Eu também poderia acrescentar que, se incluirmos essa opção como parâmetro ant, todas as outras inclusões mencionadas aqui serão excessivas. Mas não vice-versa! Portanto, esta é a melhor solução. +1 (é claro, os usuários do Maven devem fazer alterações apropriadas nas opções do Maven) #
Gangnus
1
Eu tive um problema semelhante ao tentar executar o mvn clean install, acabei de adicionar este sinalizador acima e ele foi implantado com êxito. Obrigado
Spear A1
30

O seguinte funciona para o wsimport 2.2.9 incluído no jdk 1.8.0_66:

wsimport -J-Djavax.xml.accessExternalSchema=all ....
tanderson
fonte
Isso funciona para mim. Eu tentei com o jdk 1.8.0_65 e isso não funcionou, portanto, verifique se você está usando o jdk 1.8.0_66 ou posterior.
Jabe
2
Esta é a resposta correta ao usar wsimportdiretamente.
Christopher Schultz
20

No meu caso, adicionando:

javax.xml.accessExternalSchema = all

para o jaxp.properties não funcionou, devo adicionar:

javax.xml.accessExternalDTD = all

Meu ambiente é linux mint 17 e java 8 oracle. Vou colocá-lo lá como resposta para pessoas com o mesmo problema.

moretti.fabio
fonte
2
Depende se você deseja permitir acesso à DTD externa ou ao XML Schema (XSD). DTD é o antecessor do XML Schema. Também pode haver casos em que você precisa definir os dois!
Philip Helger
17

Eu testei isso na versão 2.4 do artefato org.codehaus.mojo e funcionou ~

<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
fonte
1
Talvez seja o vmArgs -Djavax.xml.accessExternalSchema=allque está configurado na sua declaração de plug-in. Isso é discutido no Netbeans Bug 244891
kosgeinsky
15

Aqui está uma dica Dica para usuários graduados sem direitos de administrador: adicione esta linha à sua tarefa jaxb:

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

Isso parecerá assim:

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

Se você estiver tendo esse problema ao converter wsdl em jave com o plugin cxf-codegen-plug-in , poderá resolvê-lo configurando o plug-in para fork e forneça a opção 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
fonte
1
obrigado! todas as opções acima não ajudarem e seu está trabalhando para mim
ludenus
10

Eu também estava recebendo um tipo semelhante de erro no Eclipse durante o teste de um programa de serviço da web no servidor da 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.

Eu adicionei javax.xml.accessExternalSchema = All emjaxp.properties , mas o trabalho doesnot para mim.

No entanto, encontrei aqui uma solução abaixo, que funciona para mim: Para o GlassFish Server, preciso modificar domain.xmlo GlassFish, path: <path>/glassfish/domains/domain1or domain2/config/domain.xml) e adicionar, <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>sob a <java-config>tag

....

<java-config> ... <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options> </java-config> ... e, em seguida, reinicie o servidor GlassFish

Debashish
fonte
Eu vejo duas instâncias de <java-config classpath-suffix…> no arquivo domain.xml. Ambos têm seções de <jvm-options> neles. Coloquei a linha acima (com as tags jvm-options) nas duas seções. Ainda não funciona para executar o Serviço Web de Teste. Sei que o projeto está funcionando porque o arquivo do cliente codificado manualmente acessa os arquivos de serviço e imprime as informações corretas no console (no banco de dados associado aos arquivos de serviço).
Max West
<p> Eu fechei o projeto e o projeto cliente saiu do NetBeans e esperei que o Glassfish se desligasse (ele mostra um medidor de progresso enquanto ele está sendo desligado). Em seguida, reiniciei o Netbeans, recarreguei o projeto Web Services, recarreguei o arquivo Client (é apenas uma classe Java em uma pasta separada / regular do Projeto Java). O cliente imprime as tabelas, que mostram que o servidor e o servidor de banco de dados estão funcionando, bem como os serviços Web e EJBs do serviço SOAP. Simplesmente não está funcionando. A configuração accessExternalSchema está oculta em algum lugar e não está sendo definida corretamente no novo JDK. </p>
Max West
7

Habilitando o acesso ao esquema externo

Você precisa habilitar o IDE e o GlassFish Server para acessar o esquema externo para analisar o arquivo WSDL do serviço da web. Para habilitar o acesso, você precisa modificar os arquivos de configuração do IDE e do GlassFish Server. Para obter mais detalhes, consulte o FAQ. Como habilitar a análise do WSDL com um esquema externo? Configurando o IDE

Para gerar um cliente de serviço da Web no IDE a partir de um serviço da Web ou arquivo WSDL, é necessário modificar o arquivo de configuração do IDE (netbeans.conf) para adicionar a seguinte opção a netbeans_default_options.

-J-Djavax.xml.accessExternalSchema=all

Para obter mais informações sobre como localizar e modificar o arquivo de configuração netbeans.conf, consulte Perguntas frequentes sobre o Netbeans Conf. Configurando o servidor GlassFish

Se você estiver implantando no GlassFish Server, precisará modificar o arquivo de configuração do GlassFish Server (domain.xml) para permitir que o servidor acesse esquemas externos para analisar o arquivo wsdl e gerar o cliente de teste. Para ativar o acesso a esquemas externos, abra o arquivo de configuração do GlassFish (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) e adicione o seguinte elemento de opção da JVM (em negrito). Você precisará reiniciar o servidor para que a alteração entre em vigor.

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

Ao usar o Maven com o IntelliJ IDE, você pode adicionar -Djavax.xml.accessExternalSchema=allà configuração do Maven em Opções da JVM para configuração do Maven Build Tools Runner

Dexter Legaspi
fonte
Funciona com Linux Mint 17.3, JDK 1.8.0.74 e Intellij IDEA 15. Thx.
stuchl4n3k
Agradável ! também é trabalho para mim quando eu uso "mvn clean install -Djavax.xml.accessExternalSchema = all" diretamente no terminal independentemente de IDE
Tanorix
5

Isso funciona no jdk1.8.0_65

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

Para aqueles que usam a tarefa ANT wsimport, uma maneira de passar a opção sugerida por @CMFly e especificada na documentação é a seguinte:

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

Agora está corrigido na versão 2.5 (lançada em jul / 17). https://github.com/mojohaus/jaxws-maven-plugin/issues/8 .

Para as versões 2.4.x, há uma solução alternativa (conforme descrito em 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
fonte
3

Usei-o com um projeto maven regular e resolvi-o com esta configuração de dependência de plug-in para executar o 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
fonte
Com esta solução, eu precisava atualizar jaxws-maven-pluginpara o 2.5 conforme especificado em outras respostas mojohaus.org/jaxws-maven-plugin/usage.html Mas ainda assim, a melhor resposta no meu caso, obrigado!
DependencyHell
3

Crie um arquivo chamado jaxp.properties(se não existir) no caminho para sua "versão do JDK / jre / lib" e adicione esta linha nele:

javax.xml.accessExternalSchema = all
Gayan Mettananda
fonte
2

Outra solução para resolver: wiki.netbeans.org

O assistente Web Service Client no IDE analisa o arquivo WSDL ao gerar um cliente de serviço da Web a partir de um serviço da Web ou arquivo WSDL. Você precisa modificar o arquivo de configuração do IDE (netbeans.conf) para adicionar a seguinte opção ao netbeans_default_options. Você precisará reiniciar o IDE para que a alteração entre em vigor.

-J-Djavax.xml.accessExternalSchema=all

Ao implantar no GlassFish, você precisa habilitar o acesso ao esquema externo para gerar um cliente de teste para um serviço da web. Para ativar o acesso, você precisa modificar o arquivo de configuração do GlassFish Server (GLASSFISH_INSTALL / glassfish / domains / domain1 / config / domain.xml) e adicionar o seguinte elemento de opção da JVM. Você precisará reiniciar o servidor para que a alteração entre em vigor.

</java-config>
  ...
  <jvm-options>-Djavax.xml.accessExternalSchema=all</jvm-options>
</java-config>
Özgür Akıncı
fonte
Me desculpe, eu não consigo pensar em mais nada.
Özgür Akıncı
1

Se você estiver usando ant, poderá adicionar um jvmarg às suas chamadas java:

<jvmarg value="-Djavax.xml.accessExternalSchema=all" />
CMfly
fonte
Você pode ser mais específico onde coloca isso em um arquivo ant?
John L
1

Uma solução portátil muito simples seria colocar a seguinte linha de código em algum lugar de uma parte crucial do seu código, parte da qual você tem certeza de que será executado (por exemplo, diretamente no método principal):

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

Isso define a propriedade do sistema necessária programaticamente, sem ter que fazer alterações complicadas no maven pom.xml (que, por algum motivo, não funcionaram para mim).

R Hoekstra
fonte
1

Eu apenas tentei que se você usar SoapUI (5.4.x)e usar a Apache CXFferramenta para gerar código java, colocar javax.xml.accessExternalSchema = allno YOUR_JDK/jre/lib/jaxp.propertiesarquivo também funciona.

TGU
fonte
0

Outra alternativa é atualizar o shell script wsimport.sh adicionando o seguinte:

O wsimport.sh está localizado neste diretório:

jaxws-ri.2.2.28 / bin

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

Percy Williams
fonte
Eu adoraria tentar sua sugestão, mas aparentemente o jaxws-ri.2.2.28 / bin não está em nenhum lugar da minha máquina.
Max Oeste
0

Outra referência: se você estiver usando o maven-jaxb2-plugin, anterior à versão 0.9.0, poderá usar a solução alternativa descrita neste problema , na qual esse comportamento afetou o plug-in.

Niel de Wet
fonte