2014-12-04 31 views
7

Jak skonfigurować usługę internetową generowane przez WebLogic 10.3.6 przy użyciu JAX-WS zawierać schemat obiekt wewnątrz jednej deklaracji pliku WSDL, zamiast deklaracji importowej?pojedyncze WSDL bez importu schematu w WebLogic z JAX-WS

Przykład Kod:

Interfejs

import javax.ejb.Local; 

@Local 
public interface CustomerBeanLocal { 

    public void updateCustomer(Customer customer); 

} 

sesji ziarna

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

@Stateless 
@WebService 
public class CustomerBean implements CustomerBeanLocal { 

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

} 

WSDL Wygenerowane

Potrzebujemy, aby definicje schematów nie były importowane za pomocą znacznika <xsd:import> w poniższym przykładzie, ale muszą być zadeklarowane w WSDL, co oznacza, że ​​wszystkie informacje o umowie znajdują się w jednym pliku WSDL. Brak zależności innych plików.

<!-- ... --> 

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

<!-- ... --> 

Ten sam kod z WildFly zawiera typy schematów wewnątrz WSDL i nie używa funkcji importowania. Po pewnych badaniach nie znalazłem sposobu na skonfigurowanie komponentu bean/serwera do wykonania tego w WebLogic (nie znalazłem w tym celu zastrzeżonych funkcji JAX-WS lub WebLogic).

Rozumiem korzyści wynikające z posiadania wyeksportowanego schematu (możliwość ponownego użycia itp.), Ale wymaganiem projektu jest, aby typy były deklarowane w pliku WSDL, a nie importowane.

+0

Jest to całkiem dobra odpowiedź na podobne pytanie: http://stackoverflow.com/questions/16030574/jax-ws-has-xsd-schema-in-different-url –

+0

jestem oszczędność ręcznej interwencji jako ostatni zasób. Powinien istnieć sposób na jego skonfigurowanie (nawet w przypadku funkcji innej niż przenośna). Jeśli ręczna edycja jest jedyną alternatywą dla WebLogic, prawdopodobnie przejdę do umowy pierwszej generacji. – BonanzaOne

Odpowiedz

2

Używasz dostarczonego wsgen-narzędzie do WSDL generacji? Jeśli tak, istnieje parametr o nazwie:

-inlineSchemas 

który dokładnie robi to, co chcesz.

"Używane do inline schematów w wygenerowanym WSDL Musi być stosowany w połączeniu z opcją -wsdl.". (Źródło: https://jax-ws.java.net/nonav/2.2.1/docs/wsgen.html)

+1

Dostaję mój plik WSDL z adresu URL po wdrożeniu obiektów POJO JAX-B i JAX-WS w serwerze, dodając tekst "? WSDL" po pełnym adresie URL usługi. WSDL jest generowany w czasie wykonywania. Czy wiesz, w jaki sposób mogę stwierdzić, że środowisko wykonawcze generuje schematy wbudowane? Przyjrzę się również Twojej sugestii tak szybko, jak tylko będę mógł (weekend). – BonanzaOne

+0

Sprawdzanie wygenerowanego pliku WSDL przez WebLogic Widzę, że używa on WSGEN ** 2.1.5 ** (w pliku znajduje się komentarz).Ponieważ przełącznik '-inlineSchemas' został [wprowadzony w wersji 2.2.1] (https://jax-ws.java.net/nonav/2.2/docs/changelog.html), wniosek jest taki, że WebLogic w wersji 10.3.6 nie jest w stanie tego zrobić. Wygeneruję WSDL poza kontenerem za pomocą najnowszej wersji WSGEN. Dziękuję Ci. – BonanzaOne

+0

nie ma za co :-) –

0

można zautomatyzować wsgen z jaxws-maven-plugin. Najnowsza wersja wtyczki używa jaxws 2.2, ale jeśli podasz target 2.1, wygenerowane artefakty będą kompatybilne z twoją platformą.

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

Pakiet wygenerowany plik WSDL w pliku war (domyślnie pod WEB-INF/WSDL), a następnie dodać wsdlLocation do adnotacji.

@WebService(wsdlLocation = 'MyService.wsdl')