2012-09-19 11 views
5

Mam kilka plików WSDL prawie setki. Ilekroć tworzę dla nich klienckie klienckie jaxb, Jaxb automatycznie odwzorowuje wszystkie pola daty/czasu na XMLGregorianCalender. Po wielu poszukiwaniach, okazało się, że jedynym rozwiązaniem jest zapewnienie osobnego pliku wiążącego.Personalizacja WSDL: XMLGregorianCalender na java.util.Date

Nie chcę udostępniać lokalizacji wsdl, ponieważ mam ich tak wiele, ponieważ w przeciwnym razie musiałbym utworzyć oddzielne pliki powiązań dla każdego kodu wsdl.

Poniżej znajduje się plik powiązania, którego użyłem.

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" > 
    <globalBindings> 
     <javaType name="java.util.Date" xmlType="xsd:dateTime" /> 
    </globalBindings> 
</bindings> 

Stworzyła klas JAXB z datą typów ale stworzył także adapter nazwie Adapter1.java automatycznie które zostało wprowadzone w których nie chcę. Mam swoją własną strukturę pakietów i nie mogę od niej odejść.

org.w3._2001.xmlschema

i ten adapter konwertuje datę z String do java.util.Date a mój wniosek nie jako konwerter powinien przekonwertować z XMLGregorianCalender do java.util.Date

Więc napisałem adaptera sobie

import java.util.Date; 
import java.util.GregorianCalendar; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import javax.xml.datatype.DatatypeFactory; 
import javax.xml.datatype.XMLGregorianCalendar; 

import java.util.Calendar; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 



public class DateAdapter extends XmlAdapter<XMLGregorianCalendar, Date> { 

    @Override 
    public XMLGregorianCalendar marshal(Date date) throws Exception { 
     GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
     gregorianCalendar.setTime(date); 
     XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); 
     return xmlGregorianCalendar; 
    } 

    @Override 
    public Date unmarshal(XMLGregorianCalendar xmlGregorianCalendar) throws Exception { 
     return xmlGregorianCalendar.toGregorianCalendar().getTime(); 
    } 

} 

i zmieniłem plik dostosowywania tak:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" > 
    <globalBindings> 
     <javaType name="java.util.Date" xmlType="xsd:dateTime" 
     parseMethod="DateAdapter.marshal" 
      printMethod="DateAdapter.unmarshal" /> 
    </globalBindings> 
</bindings> 

Następnie uruchomiłem narzędzie wsimport i nie udało się.

C:\Users\stuart\Desktop\code>wsimport -s src -d gen -b cust.txt http://localhost:8080/webservice-jaxws/DummyService?wsdl 


parsing WSDL... 


generating code... 


compiling code... 

C:\Users\stuart\Desktop\code\src\org\w3\_2001\xmlschema\Adapter1.java:13: cannot find symbol 
symbol : variable DateAdapter 
location: class org.w3._2001.xmlschema.Adapter1 
     return (DateAdapter.marshal(value)); 
       ^
C:\Users\stuart\Desktop\code\src\org\w3\_2001\xmlschema\Adapter1.java:17: cannot find symbol 
symbol : variable DateAdapter 
location: class org.w3._2001.xmlschema.Adapter1 
     return (DateAdapter.unmarshal(value)); 
       ^
2 errors 
compilation failed, errors should have been reported 

i ciągle moje ustawienia dostosowania w cust.txt jak podano w komendzie wsimport, a mój plik źródłowy klasy DateAdapter było również w tym samym katalogu. Klasa była bez pakietu. Oto moja struktura katalogów.

³ cust.txt 
³ DateAdapter.java 
³ 
ÃÄÄÄgen 
³ ÃÄÄÄorg 
³ ³ ÀÄÄÄw3 
³ ³  ÀÄÄÄ_2001 
³ ³   ÀÄÄÄxmlschema 
³ ³     Adapter1.class 
³ ³     
³ ÀÄÄÄwebservice 
³  ÀÄÄÄjaxws 
³   ÀÄÄÄgenerated 
³     GetBook.class 
³     GetBookResponse.class 
³     ObjectFactory.class 
³     package-info.class 
³     Book.class 
³     BookService.class 
³     BookServiceImpl.class 
³     ReturnBook.class 
³     ReturnBookResponse.class 
³     
ÀÄÄÄsrc 
    ÃÄÄÄorg 
    ³ ÀÄÄÄw3 
    ³  ÀÄÄÄ_2001 
    ³   ÀÄÄÄxmlschema 
    ³     Adapter1.java 
    ³     
    ÀÄÄÄwebservice 
     ÀÄÄÄjaxws 
      ÀÄÄÄgenerated 
        GetBook.java 
        GetBookResponse.java 
        ObjectFactory.java 
        package-info.java 
        Book.java 
        BookService.java 
        BookServiceImpl.java 
        ReturnBook.java 
        ReturnBookResponse.java 

Odpowiedz

0

rozwiązać to za pomocą deklaracji same powiązań zrobiłeś z wyjątkiem mojego DateAdapter faktycznie wyglądał tak:

public class DateAdapter { 

    private DateAdapter() {} 

    public static String marshal(Date date) { 
     Calendar cal = GregorianCalendar.getInstance(); 
     cal.setTime(date); 
     return DatatypeConverter.printDateTime(cal); 
    } 

    public static Date unmarshal(String xmlDate) { 
     return DatatypeConverter.parseDate(xmlDate).getTime(); 
    } 
} 

I działa jak czar. Strona XML Mam dateTime i java strony Mam java.util.Date. Zrobiłem inny, który używa java.time.Instant zamiast Date, z którym łatwiej pracować.

Powiązane problemy