|
|
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
Можно ли изменить представление элемента JAXBElement<T> во время маршаллинга? В частности, интересует JAXBElement<Date>, хочется получить значение без "хвоста" (2016-11-30T11:30:05.539+03:00), на приемной стороне понимают значения только до секунды. Код: xml 1. Использование XmlAdapter<String, Date> в данном случае не помогает. Обертка JAXBElement требуется, поскольку необходимо передавать null значения Код: xml 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 11:39 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ivanra, http://stackoverflow.com/questions/11743306/how-to-represent-null-value-as-empty-element-with-jaxb Не очень понял почему JAXBElement нужен для xsi:nil? JAXB, ведь должен уметь транслировать и обычный null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 11:45 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ivanra, Вот ещё интересный хак http://stackoverflow.com/a/7110001 Я бы попробовал, чтобы адаптер выбросить. А JAXBElement заменить на аннотацию @XmlElement(required=true, nillable=true) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 11:57 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
Там еще есть и строковые параметры, которые могут принимать как null, так и пустую строку. Поэтому JAXBElement. Да и в принципе непонятно, можно ли тут отрефакторить. На уровень выше список параметров выглядит так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 12:02 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ivanra, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 19:29 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
Точнее так.ivanra Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но в этом случае придется вручную реализовывать ObjectFactory. см. доки http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlAnyElement.html Using XmlAnyElement with XmlElementRef The XmlAnyElement annotation can be used with XmlElementRefs to designate additional elements that can participate in the content tree. The following schema would produce the following Java class: <xs:complexType name="foo"> <xs:choice maxOccurs="unbounded" minOccurs="0"> <xs:element name="a" type="xs:int" /> <xs:element name="b" type="xs:int" /> <xs:any namespace="##other" processContents="lax" /> </xs:choice> </xs:complexType> class Foo { @XmlAnyElement(lax="true") @XmlElementRefs({ @XmlElementRef(name="a", type="JAXBElement.class") @XmlElementRef(name="b", type="JAXBElement.class") }) List<Object> others; } @XmlRegistry class ObjectFactory { ... @XmlElementDecl(name = "a", namespace = "", scope = Foo.class) JAXBElement<Integer> createFooA( Integer i ) { ... } @XmlElementDecl(name = "b", namespace = "", scope = Foo.class) JAXBElement<Integer> createFooB( Integer i ) { ... } It can unmarshal instances like <foo xmlns:e="extra"> <a>1</a> // this will unmarshal to a <A HREF="../../../../javax/xml/bind/JAXBElement.html" title="class in javax.xml.bind"><CODE>JAXBElement</CODE></A> instance whose value is 1. <e:other /> // this will unmarshal to a DOM <A HREF=" http://java.sun.com/j2se/1.5/docs/api/org/w3c/dom/Element.html" title="class or interface in org.w3c.dom"><CODE>Element</CODE></A>. <b>3</b> // this will unmarshal to a <A HREF="../../../../javax/xml/bind/JAXBElement.html" title="class in javax.xml.bind"><CODE>JAXBElement</CODE></A> instance whose value is 1. </foo> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 20:26 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
Usman, не то. Вопрос был про кастомизацию маршаллинга. Чтобы вместо этого Код: xml 1. 2. 3. 4. передавалось вот это Код: xml 1. 2. 3. 4. Можно ли задействовать адаптеры для типов данных внутри JAXBElement?. Например, есть Код: java 1. но помещение его в package-info не дает эффекта для JAXBElement<Date>, хотя в случае обычных пропертей типа Date всё работает Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 11:05 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ivanra, Так что на Calendar заменить никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 11:41 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
Blazkowiczivanra, Так что на Calendar заменить никак?Тоже не то - при маршаллинге всё равно есть миллисекунды (если установить в 0, то будет окончание .000) - хочется также избавиться от бойлеркода Date <-> XMLGregorianCalendar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 12:22 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ivanra, можно так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 13:08 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ferc, тоже миллисекунды будут. Тут кровавый легаси энтернпрайз, надо только в определенном формате. Вот 2 возможных решения: 1) Для случаев, когда не надо передавать пустые значения, заменяем JAXBElement<Date> на свою обертку Код: java 1. 2. 3. 4. 5. 6. 7. На уровень выше меняем аннотацию, чтобы указывала на этот класс Код: java 1. Всё прозрачно работает, но в этом случае пустые даты будут передаваться как <dateParameter/> без атрибута nil. Дальше остается только надеяться, что на приемной стороне анмаршаллинг пройдет нормально. 2) другой вариант - вместо JAXBElement<Date> использовать JAXBElement<String>, форматируя это всё в слое логики. Ничего хорошего, но для штучных случаев сойдет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 15:41 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
ivanraМожно ли изменить представление элемента JAXBElement<T> во время маршаллинга? что надо гуглить, чтобы понять Ваш вопрос? Правильно ли я понял? Вы используете jaxb для того, чтобы сформировать xml и во время маршалинга (сохранение объектов в xml) имеете хвост в виде милисекунд? Что такое JAXBElement<T>? Что значит представление элемента? Удалось ли как-то задачу уже решить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 12:34 |
|
||
|
Адаптер для JAXBElement<T>
|
|||
|---|---|---|---|
|
#18+
IHmG, всё выглядело примерно так. Есть некий сервис, в схеме которого написано: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Это описание параметров для вызываемых функции. В том числе, параметры могут иметь нулевые значения, и тогда передаются они в таком виде: Код: xml 1. xjc по этой схеме сгенерировала класс с аннотацией Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. и дальше встал вопрос, как передавать даты (в комментариях схемы читаем, что это должен быть формат YYYY-MM-DD). Использование адаптера для даты в данном случае не помогает, так как значения обернуты в JAXBElement. Об этом и был вопрос. Конечным решением для меня стало использование вместо JAXBElement<Date> такого класса Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Соответственно изменена строчка в аннотации для элемента "dateParameter" Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В таком виде адаптер для даты работает. Класс простейший: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Подключаем его сразу ко всему пакету с помощью аннотации в package-info Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2016, 15:12 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=79&tid=2123351]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 325ms |

| 0 / 0 |
