2011-10-07 16 views
8

Zajmuję się tworzeniem usługi WWW Java, która będzie używana przez klientów .Net. Usługa udostępnia metodę, która akceptuje obiekt jako argument, ten obiekt ma pole typu Lista, klasa Wiersz ma również pole typu Lista.Wywołanie usługi Java Web Service z domeny .Net korzystającej z listy <T>

Teraz, gdy klient Java korzysta z tej usługi, poprawnie widzi typy jako List, jednak gdy klient .Net zużywa usługę, którą kończę, oczekując połączenia z tablicą typu Value (np. Value [] []) zamiast listy.

Zgodność wersji została ustawiona na ".Net 3.5/METRO 1.3".

Czy ktoś wie, w jaki sposób mogę uzyskać to samo z klientami .Net i Java w tym, że akceptują listę zamiast wartości [] []?

wycięte wersje usługi internetowej to:

Usługa:

@WebService(serviceName = "Test") 
    public class Test { 

    @WebMethod(operationName = "DataRequest") 
    public DataResponse DataRequest(DataRequest req) { 
     return new DataResponse(); 
    } 

} 

DataRequest:

public class DataRequest { 
    public DataType datType; 
    public String source; 
    public List<RowInfo> rows; 
    public String loginId; 
} 

RowInfo:

public class RowInfo { 
    public List<Value> valueList; 
} 

Wartość:

public class Value {  
    public String name; 
    public String value; 
} 

Na moim kliencie .Net, kiedy próbuję zbudować obiekt żądania, widzi pole wierszy FeeDataRequest jako wartość [] [] zamiast listy.

Odwołanie do usługi w .Net zostało skonfigurowane w taki sposób, że typem kolekcji jest System.Collections.Generic.List.

Każdy pomysł, jak zrobić .Net widzi to poprawnie?

+5

Do integracji międzyjęzykowej przy użyciu WSDL zdecydowanie zalecam podejście oparte na umowie, zaprojektuj WSDL (+ XSD), wygeneruj po stronie serwera kod Java i kod .net po stronie klienta. To trochę więcej pracy, ale masz większe szanse, że to działa. – home

+0

+1 do @home za uderzenie w kwadrat na nosie. W rzeczywistości WS nie wspiera natywnie kolekcji Java ani Map. Chociaż niektórzy dostawcy, tacy jak Oracle, mają własne rozszerzenia, których można użyć do osiągnięcia tego celu, lepiej jest wdrożyć wieloplatformową usługę internetową z projektowaniem od góry do dołu. – Perception

+2

Dzięki @Perception. Inną (moim zdaniem) zaletą jest to, że masz umowę _explicit_ zdefiniowaną w formacie niezależnym od języka, co w jakiś sposób zmusza Cię do utrzymania małego i ścisłego interfejsu. – home

Odpowiedz

0

Wszystko, czego potrzebujesz, to używać tablic, gdziekolwiek się spodziewasz. nie musisz się już martwić o nic innego:

+1

Problem nie dotyczy pojedynczej tablicy. Jeśli spodziewał się jednej macierzy, nie byłoby problemu. Jednak w tym przypadku .Net widzi postrzępioną tablicę (Value [] [])) zamiast tego, czego oczekiwałbym, widząc tablicę RowInfo. –

+0

Czy to naprawdę problem? Czy masz problemy z definicją poszarpanej tablicy w .NET? –

+0

@Paul dla późniejszego problemu, jestem po stronie OP, który jest problemem. Właściwie to jestem zaskoczony, że OP nie widzi Tablicy RowInfo. Coś tam wygląda podejrzanie. @ Alan powinieneś opublikować WSDL, czy próbowałeś używać tablicy zamiast tylko po to, aby zobaczyć, czy wygenerowany WSDL jest poprawnie wybrany przez .net jako tablica RowInfo? – eglasius

1

Czy możesz opublikować plik WSDL usługi internetowej.

Domyślnie po wygenerowaniu WSDL obiekt List jest konwertowany na tablicę. To z WSDL, .NET próbuje zbudować typy obiektów.

Także jeśli twoja klasa RowInfo ma tylko zbiór obiektów wartość jest nie łatwy w użyciu kolekcji obiektów wartość w DataRequest zamiast zbierania RowInfo obiektów

2

Korzystając json lub xml do przesyłania danych między swoimi usługami.

0

Zalecam najpierw zrobić WSDL i utworzyć klientów i interfejsy stamtąd. Następnie wykonaj mapowanie do obiektów, z którymi musisz się uporać w implementacji usługi.

schematu byłoby coś

<complexType name="DataRequest"> 
    <all> 
     <element name="datType" type="DataType" /> 
     <element name="source" type="string" /> 
     <element name="rows"> 
      <complexType> 
       <sequence> 
        <element name="row" type="RowInfo" minOccurs="0" maxOccurs="unbounded" /> 
       </sequence> 
      </complexType> 
     </element> 
     <element name="loginId" type="string" /> 
    </all> 
</complexType> 

Obserwowani przez RowInfo przy użyciu tego samego wzoru mieliśmy na wierszach. To jest minOccurs = "0" i maxOccurs = "bez ograniczeń". Spowoduje to, że generator klienta utworzy listę.

<complexType name="RowInfo"> 
    <sequence> 
     <element name="valueList" type="Value" minOccurs="0" maxOccurs="unbounded" /> 
    </sequence> 
<complexType> 

Ostatnim typem jest wartość.

<complexType name="Value"> 
    <all> 
     <element name="name" type="string" /> 
     <element name="value" type="string" /> 
    </all> 
</complexType> 

Na koniec potrzebujesz elementu zawierającego.

<element name="dataRequest" type="DataRequest" /> 

Oczywiście powyższe jest po prostu parafrazą, nadal trzeba umieścić w przestrzeni nazw i takie.

Jednym z problemów z nowymi programistami usług sieciowych (włącznie z mną) jest to, że wystarczy napisać kod usługi internetowej i wygenerować kod, aby to zrobić, to dobry pomysł. Niestety, po zabawie z nim, myślę, że jeśli masz kogoś, kto wie, jak pisać schematy WSDL i XML, lepiej mieć współdziałanie i czerpać korzyści z usług sieciowych.

W szczególności część schematu XML. Jestem w szkole, że podejście hybrydowe (pierwszy kod WSDL, ale pierwszy schemat kontraktu) jest prawdopodobnie najlepszym podejściem, ponieważ nie musisz zajmować się powtarzaniem siebie, wykonując wiążący kod. Jednak umiejętności niezbędne do zrozumienia go stają się trudniejsze.

Powiązane problemy