JAX-WS: Как исключить «член / поле» в объекте ответа (WS Response), который наследуется? - PullRequest
9 голосов
/ 14 ноября 2009

У меня есть веб-сервис, который возвращает в результате вызова веб-сервиса объект ResponseObject с именем "CustomerResponse". Когда я реализую этот объект «с нуля», все работает нормально: моя реализация в этом случае содержит только все необходимые «простые типы», такие как строки, целые числа, но НЕТ ссылок / ассоциаций объектов.

Однако я хотел «повторно использовать» существующие объекты. В моей доменной модели есть объект "Customer", который используется в самом приложении. Вместо того, чтобы тупо более или менее клонировать Customer в объект «CustomerReponse» (вручную вводя заново все члены / поля), я хотел основать объект CutomerResponse на объекте Customer по расширению:

class CustomerResponse extends Customer

==> Проблема в том, что теперь CustomerResponse содержит некоторые «внутренние» поля, которые были унаследованы от объекта Customer (например, DatabaseID, Security-Stuff), который я не хочу показывать через веб-сервис. Кроме того (и это в настоящее время основная проблема ") Customer также содержит множество" ссылок / ассоциаций объектов "на другие объекты, такие как Address, Orders, History, которые я не хочу показывать через веб-сервис. . (Похоже, что Apache CXF «оценивает» весь Objectgraph и пытается включить их в ResponseObject ...)

==> Можно ли "расширить" объекты ответа WebService на основе существующих объектов и каким-либо образом исключить некоторые "члены / поля" расширенного супертипа? (Поэтому я хочу исключить некоторые элементы (например, DatabseID) и все «ассоциации объектов», такие как (Address / Orders / Histroy). Как мне это сделать, с какими аннотациями и процедурами?

Большое спасибо !! Jan

Ответы [ 3 ]

11 голосов
/ 29 января 2013

Что касается аннотации @XmlTransient, я обнаружил, что вам нужно поместить ее в метод получения поля, которое вы хотите скрыть.

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

В этом примере «fieldHide» не будет виден в службе xsd.

6 голосов
/ 18 ноября 2009

Аннотация @XmlTransient используется для скрытия членов, которые вы не хотите показывать. Вы должны иметь возможность комментировать этих участников, и они не будут связаны. В качестве альтернативы, измените свой @XmlAccessorType на XmlAccessType.NONE , и только XML-методы с конкретными комментариями будут привязаны к XML.

0 голосов
/ 20 ноября 2009

C # решает эту проблему с частичными классами. Я не знаю, как это сделать с jax-ws.

...