2014-12-04 7 views
7

Come configurare un servizio Web generato da WebLogic 10.3.6 utilizzando JAX-WS per includere lo schema di oggetto all'interno di una singola dichiarazione di file WSDL, anziché una dichiarazione di importazione?Singolo WSDL senza importazione di schemi in WebLogic con JAX-WS

codice

Esempio:

interfaccia

import javax.ejb.Local; 

@Local 
public interface CustomerBeanLocal { 

    public void updateCustomer(Customer customer); 

} 

Session Bean

import javax.ejb.Stateless; 
import javax.jws.WebService; 

@Stateless 
@WebService 
public class CustomerBean implements CustomerBeanLocal { 

    @Override 
    public void updateCustomer(Customer customer) { 
     // Do stuff... 
    } 

} 

WSDL generato

Le definizioni dello schema non devono essere importate con il tag <xsd:import> nell'esempio seguente, ma per essere dichiarate all'interno del WSDL, il che significa che tutte le informazioni sul contratto si trovano in un singolo file WSDL. Nessuna dipendenza da altri file.

<!-- ... --> 

<types> 
    <xsd:schema> 
    <xsd:import namespace="http://mybeans/" schemaLocation="http://192.168.10.1:7001/CustomerBean/CustomerBeanService?xsd=1" /> 
    </xsd:schema> 
</types> 

<!-- ... --> 

Lo stesso codice con WildFly include i tipi di schema all'interno del WSDL e non utilizzare la funzione di importazione. Dopo alcune ricerche non ho trovato un modo per configurare il bean/server per farlo in WebLogic (non ho trovato caratteristiche proprietarie JAX-WS o WebLogic per farlo).

Capisco i vantaggi di avere uno schema esportato (riusabilità, ecc.) Ma è un requisito del progetto che i tipi devono essere dichiarati all'interno del WSDL, non importati.

+0

Questa è una buona risposta a una domanda simile: http://stackoverflow.com/questions/16030574/jax-ws-has-xsd-schema-in-different-url –

+0

Mi risparmio intervento manuale come ultima risorsa. Ci dovrebbe essere un modo per configurarlo (anche con una funzione non portatile). Se l'edizione manuale è l'unica alternativa per WebLogic, allora probabilmente andrò per la prima generazione del contratto. – BonanzaOne

risposta

2

Usi lo strumento wsgen fornito per la generazione wsdl? Se sì, c'è un parametro chiamato:

-inlineSchemas 

che fa esattamente ciò che si desidera.

"usato per inline schemi in un WSDL generata deve essere utilizzato in combinazione con l'opzione -wsdl.". (Fonte: https://jax-ws.java.net/nonav/2.2.1/docs/wsgen.html)

+1

Ottengo il mio WSDL dall'URL dopo l'implementazione di POJO annotati JAX-B e JAX-WS nel server, aggiungendo il testo "? WSDL" dopo l'URL del servizio completo. Il WSDL viene generato in fase di runtime. Sai in qualche modo che posso dire al runtime di generare gli schemi in linea? Osserverò il tuo suggerimento il più presto possibile (fine settimana). – BonanzaOne

+0

Controllo del file WSDL generato da WebLogic Vedo che utilizza WSGEN ** 2.1.5 ** (c'è un commento all'interno del file).Poiché l'opzione '-inlineSchemas' è stata [introdotta dalla versione 2.2.1] (https://jax-ws.java.net/nonav/2.2.1/docs/changelog.html), la conclusione è che WebLogic alla versione 10.3.6 non è in grado di farlo. Genererò i WSDL all'esterno del contenitore utilizzando una versione recente di WSGEN. Grazie. – BonanzaOne

+0

prego :-) –

0

È possibile automatizzare wsgen con il jaxws-maven-plugin. L'ultima versione del plugin utilizza jaxws 2.2 ma se si specifica target 2.1, le risorse generate saranno compatibili con la piattaforma.

<plugin> 
    <groupId>org.jvnet.jax-ws-commons</groupId> 
    <artifactId>jaxws-maven-plugin</artifactId> 
    <version>2.3</version> 
    <executions> 
     <execution> 
     <id>wsgen</id> 
     <phase>process-classes</phase> 
     <goals> 
      <goal>wsgen</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <sei>...put your WS impl class here...</sei> 
     <keep>true</keep> 
     <verbose>true</verbose> 
     <target>2.1<verbose> 
     <genWsdl>true</genWsdl> 
     <xnocompile>true</xnocompile> 
     <inlineSchemas>true</inlineSchemas> 
    </configuration> 
    </plugin> 

pacchetto il file WSDL generato nel file di guerra (per impostazione predefinita sotto WEB-INF/WSDL) e quindi aggiungere wsdlLocation alla vostra annotazione.

@WebService(wsdlLocation = 'MyService.wsdl') 
Problemi correlati