2013-11-19 2 views
1

У меня есть файл WSDL, ссылающийся на файл XSD с элементами типа gYearMonth. Я не могу его изменить. Я хотел бы использовать JAXB для автоматического создания классов с членами типа YearMonth библиотеки времени Joda.Трансформировать gYearMonth XSD в YearMonth Джоды

Я видел статью JAXB and Joda-Time: Dates and Times, чтобы быть довольно интересной, но я заинтересован в выполнении этой привязки на лету от WSDL до Java, а не от Java до WSDL.

Я создал свой XmlAdapter (да, нет колдовство здесь):

import org.joda.time.YearMonth; 
public class YearMonthAdapter extends XmlAdapter<String,YearMonth> { 
    @Override public YearMonth unmarshal(String v) throws Exception { 
    return new YearMonth(v); 
    } 
    @Override public String marshal(YearMonth v) throws Exception { 
    return v.toString(); 
    } 
} 

Но где и как зарегистрировать его в моем bindings.xml так что я получаю YearMonth, а не XMLGregorianCalendar при генерации кода?

ответ

1

Вы можете использовать файл привязки, как показано ниже, для подключения к XmlAdapter при создании Java-модели из XML-схемы.

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> 
    <jxb:bindings schemaLocation="format.xsd"> 
     <jxb:bindings node="//xs:element[@name='number']"> 
      <jxb:property> 
       <jxb:baseType> 
        <jxb:javaType name="java.lang.Integer" 
         parseMethod="blog.xmladapter.bindings.NumberFormatter.parseInt" 
         printMethod="blog.xmladapter.bindings.NumberFormatter.printInt" /> 
       </jxb:baseType> 
      </jxb:property> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

для получения дополнительной информации

+0

Спасибо, это работает. + +1. Но для принятого ответа я бы хотел получить ответы на две вещи (они довольно явны в исходном вопросе): 1. Я хочу сделать все 'gYearMonth' Joda' YearMonth', нужно ли перечислять все имена? использование '@ type', похоже, не работает. 2. Я написал свой XmlAdapter без статического метода. Невозможно использовать JAXB, а не заставлять меня создавать статические версии методов и писать имена методов, как правило, что-то вроде '' ? Необязательно, если это адаптировано к globalBindings, а не к базе XSD. –

+0

Используйте 'jaxb: globalBindings' только для определения привязки одного времени. Используйте «xjc: javaType adapter =« your.path.to »для определения самого адаптера, а не статических методов синтаксического анализа и печати. – membersound

Смежные вопросы