2009-11-14 8 views
8

Ho un servizio Web che restituisce come risultato del richiamo del servizio Web un oggetto ResponseObject chiamato "CustomerResponse". Quando implemento questo oggetto "da zero" tutto funziona perfettamente: la mia implementazione in questo caso contiene solo tutti i "Simple Types" necessari come String, Integers ma NO riferimenti/associazioni oggetto.JAX-WS: Come escludere un "membro/campo" in un oggetto risposta (WS Response) che viene ereditato?

Tuttavia, ciò che volevo fare è "riutilizzare" oggetti esistenti. Ho nel mio modello di dominio un oggetto "Customer" che viene utilizzato nell'applicazione stessa. Invece di stupidamente più o meno la clonazione del Customer nell'oggetto "CustomerReponse" (digitando manualmente nuovamente tutti i membri/campi), ho voluto basare l'oggetto CutomerResponse sul Customer oggetto per estensione:

class CustomerResponse extends Customer 

== > Il problema è che ora CustomerResponse contiene alcuni campi "interni" ereditati dall'oggetto Customer (come DatabaseID, Security-Stuff) che non desidero esporre tramite il Web-Service. Inoltre (e questo è attualmente il problema principale ") Customer contiene anche molti" riferimenti/associazioni oggetto "ad altri oggetti come Address, Orders, History che non voglio esporre tramite il servizio Web. (Sembra che Apache CXF" valuta" l'intera ObjectGraph e cerca di includerli nella ResponseObject ...)

==> e 'possibile 'Extend' Oggetti di risposta WebService basate su oggetti esistenti e in qualche modo escludere alcuni 'utenti/campi' di il supertyp esteso? (Quindi voglio escludere alcuni membri (come il DatabseID) e tutte le "associazioni di oggetti" come (Indirizzo/Ordini/Histroy) .. Come posso realizzare questo, con quali annotazioni e procedure?

Grazie mille !! gen

risposta

6

L'annotazione @XmlTransient viene utilizzata per nascondere i membri che non si desidera visualizzare. Dovresti essere in grado di annotare questi membri e non saranno vincolati. In alternativa, modificare @XmlAccessorType su XmlAccessType.NONE e solo i metodi con annotazioni specifiche verranno associati a XML.

+0

Ciao KT, grazie mille per la risposta. Beh, in realtà ho provato @XMLTransient ma non ha funzionato in qualche modo. (Tuttavia, Apache CXF sembrava almeno "scansionare" l'objectgraph sul caricamento del Webservice e lanciava alcune eccezioni (dato che My objectgraph ha alcuni enum statici interni identici ...). Proverò ancora e trry XmlAccessType.NONE. ! – jan

-7

C# risolve questo problema con classi parziali. Non so come farlo con jax-ws.

10

Per quanto riguarda l'annotazione @XmlTransient, ho scoperto che è necessario inserirlo nel metodo getter del campo che si desidera nascondere.

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

Nell'esempio "fieldHide" non sarà visibile sul servizio xsd.

+0

Buon posto. Devi avere il 'transient' per il tuo campo e' @ XmlTransient' per il getter. –

+1

Ha funzionato per me senza 'transient' – Julien

+0

Non funziona per i tipi booleani. Tuttavia se annoti il ​​tuo campo booleano funziona. –

Problemi correlati