2009-11-14 7 views
8

Mam usługa WebService, która zwraca w wyniku Invokation of Web-Service obiekt ResponseObject o nazwie "CustomerResponse". Kiedy wdrażam ten obiekt "od zera" wszystko działa dobrze: Moja implementacja w tym przypadku zawiera tylko wszystkie potrzebne "proste typy", takie jak ciągi, liczby całkowite, ale brak odwołań/powiązań z obiektami.JAX-WS: Jak wyłączyć "element/pole" w obiekcie odpowiedzi (odpowiedź WS), który jest dziedziczony?

Jednak to, co chciałem zrobić, to "ponowne wykorzystanie" istniejących obiektów. Mam w moim modelu domeny obiekt "Customer", który jest używany w samej Aplikacji. Zamiast głupio mniej lub bardziej klonowanie Customer do „CustomerReponse” obiektu (poprzez ręczne wpisanie znowu wszyscy członkowie/pola), chciałem oprzeć obiekt CutomerResponse na Customer Object za tym idzie:

class CustomerResponse extends Customer 

== > Problem polega na tym, że teraz CustomerResponse zawiera pewne "wewnętrzne" pola, które zostały odziedziczone po Object (takie jak DatabaseID, Security-Stuff), których nie chcę ujawniać za pośrednictwem usługi internetowej. Ponadto (i to jest obecnie główny problem ") Customer zawiera również wiele" odniesień/skojarzeń obiektów "z innymi obiektami, takimi jak Address, Orders, History, których również nie chcę ujawniać za pośrednictwem usługi Webservice. (Wydaje się, że Apache CXF" ocenia”cały Objectgraph i stara się uwzględnić je w ResponseObject ...)

==> Czy możliwe jest«Extend»Objects WebService odpowiedzi na podstawie istniejących obiektów i jakoś wykluczyć jakieś«/ Użytkownicy z pola» rozszerzona supertyp? (więc chcę wykluczyć niektórych członków (takich jak DatabseID) i wszystkich "powiązań obiektów", takich jak (Adres/Zamówienia/Histroy) .. Jak mogę to osiągnąć, z jakim adnotacjami i procedurami?

Dziękuję bardzo! Jan

Odpowiedz

6

Adnotacja @XmlTransient służy do ukrywania członków, których nie chcesz pokazywać. Powinieneś być w stanie opisywać tych członków, a oni nie będą związani. Alternatywnie zmień swój @XmlAccessorType na XmlAccessType.NONE i tylko specjalnie opatrzone adnotacjami metody będą powiązane z XML.

+0

Witam KT, dziękuję bardzo za odpowiedź. Cóż, faktycznie wypróbowałem @XMLTransient, ale jakoś nie zadziałało. (Apache CXF mimo wszystko zdawał się przynajmniej "przeczołgać" wykres po ładowaniu Webservice i rzucił kilka wyjątków (ponieważ mój graphgraph ma jakieś identyczne wewnętrzne statyczne Enums ...) Spróbuję jeszcze raz i spróbuję twojego XmlAccessType.NONE. ! – jan

-7

C# rozwiązuje ten problem z klasami częściowymi. Nie wiem jak to zrobić z jax-ws.

10

Jeśli chodzi o adnotację @XmlTransient, dowiedziałem się, że należy umieścić ją na metodzie gettera w polu, które chcesz ukryć.

public class InputBean 
{ 
    private String fieldShow; 
    private transient String fieldHide; 

    public String getFieldShow() { 
     return fieldShow; 
    } 

    public void setFieldShow(String fieldShow) { 

     this.fieldShow = fieldShow; 
    } 

    @XmlTransient 
    public String getFieldHide() { 
     return fieldHide; 
    } 

    public void setFieldHide(String fieldHide) { 
     this.fieldHide = fieldHide; 
    } 
} 

W tym przykładzie "fieldHide" nie będzie widoczne w usłudze xsd.

+0

Dobre miejsce, potrzebujesz zarówno "przejściowego" dla twojego pola i '@ XmlTransient' dla gettera –

+1

Dla mnie działa bez' przejściowego ' – Julien

+0

Nie działa dla typów boolowskich, ale jeśli tworzymy adnotację twojego pola boolowskiego, to działa. –

Powiązane problemy