Хороший шаблон дизайна JAXB, чтобы обернуть модель или конвертировать модель (POJO)? - PullRequest
2 голосов
/ 26 октября 2011

У меня есть следующая модель

class MyClass {
    id
    someRandomString
}

Я хотел бы вернуть этот POJO клиенту как ...

<Root>
    <random>if + randomstring</random>
</Root>

В основном я имею дело с очень ориентированной на сообщениясервис, поэтому мне нужно обернуть и преобразовать модель в исходящий формат XML ... То же самое относится и к входной стороне

У меня есть этот XML ...

<Root>
    <Username>
    <Password>
    <Action> <-- Some action or service to perform
    <SomeModel1>
    <SomeModel2>
</Root>

Итак, корень иимя пользователя и пароль являются постоянными элементами, в то время как SomeModel может меняться в зависимости от «сервиса»

В основном я ищу шаблон проектирования, где XML не соответствует модели и необходимо преобразовать его ви из ...

Или что, если я это сделал ...

class MyClass {
    id
    someRandomString
    random

    @XMLTransient
    getId()


    @XMLTransient
    getSomeRandomString()


    getRandom() {
        return id + someRandomString
    }
}

Так что JAXB будет отображать только getRandom ...

Еще одна идея, которую я имею, - создатькуча классов, которые будут представлять окончательный результат и просто установить значения в thoses ...

Итак

class MyResponse {
    randomString
    status
    someOtherFieldRequired in response
}    

и тогда я могу сделать ...

myResponse.setRandomString(myClass.getId() + myClass.getSomeRandomString());

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Вы можете использовать поля id и someRandomString для разделения элементов и использовать таблицу стилей для объединения элементов в одно.JAXB предлагает класс JAXBSource, который соответствует ему с javax.xml.transform API:

MyClass myClass = new MyClass();
myClass.setId(123);
myClass.setSomeRandomString("FOO");

TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xslt = new StreamSource(new FileInputStream("my-xslt.xml"));
Transformer t = tf.newTransformer(xslt);

JAXBContext jc = JAXBContext.newInstance(MyClass.class);
JAXBSource source = new JAXBSource(jc, myClass);

StreamResult result = new StreamResult(System.out);

t.transform(source, result);
1 голос
/ 26 октября 2011

Вы можете использовать XmlAdapter в сочетании с XmlJavaTypeAdapter , но я думаю, что для этого может потребоваться инкапсуляция свойств id и someRandomString в отдельный класс.Распределение значения элемента по двум отдельным свойствам бина напрямую - это не то, что я знаю, как это сделать, если это вообще возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...