2012-09-19 14 views
5

मेरे पास लगभग wsdl फ़ाइलें लगभग सैकड़ों हैं। जब भी मैं उनके लिए क्लाइंट जैक्सबी क्लाइंट क्लासेस बना देता हूं तो जैक्सब स्वचालित रूप से सभी दिनांक/समय फ़ील्ड को XMLGregorianCalender पर मानचित्र करता है। बहुत सारे गुगलिंग के बाद, मैंने पाया कि एक अलग बाध्यकारी फ़ाइल प्रदान करना एकमात्र समाधान है।डब्लूएसडीएल अनुकूलन: XMLGregorianCalender java.util.Date

मैं wsdl स्थान प्रदान नहीं करना चाहता, क्योंकि मेरे पास बहुत सारे हैं, अन्यथा मुझे प्रत्येक wsdl के लिए एक अलग बाध्यकारी फाइलें बनाना होगा।

नीचे उपयोग की जाने वाली बाध्यकारी फ़ाइल है।

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

यह तिथि प्रकार के साथ JAXB कक्षाओं बनाया है, लेकिन यह भी एक एडाप्टर Adapter1.java स्वचालित रूप से कहा जाता है जो रखा गया था है जिसमें मैं नहीं चाहता बनाया। मेरे पास अपनी खुद की पैकेज संरचना है और इससे विचलित नहीं हो सकता है।

org.w3._2001.xmlschema

और इस एडाप्टर java.util.Date के लिए स्ट्रिंग से तारीख धर्मान्तरित और अपने आवेदन में विफल रहता है के रूप में कनवर्टर XMLGregorianCalender से java.util.Date में बदलने चाहिए

तो, मैं एक एडाप्टर अपने आप

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

} 

लिखा था और इस तरह मेरी अनुकूलन फ़ाइल बदल:

+०१२३५१६४१०
<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> 

तब मैं wsimport उपकरण चला गया और यह असफल रहा।

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 

और मैं wsimport आदेश में दी गई, और मेरी DateAdapter वर्ग स्रोत फ़ाइल एक ही निर्देशिका में भी था, क्योंकि cust.txt में मेरे अनुकूलन सेटिंग्स रखा। कक्षा पैकेज के बिना थी। निम्नलिखित मेरी निर्देशिका संरचना है।

³ 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 

उत्तर

0

ही बाइंडिंग घोषणा तुम मेरे DateAdapter को छोड़कर किया, वह इस तरह देखा का उपयोग करके इस हल:

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

और यह एक आकर्षण की तरह काम करता है। एक्सएमएल पक्ष में मेरे पास डेटटाइम और जावा साइड है मेरे पास java.util.Date है। मैंने वास्तव में एक और बनाया जो java.time का उपयोग करता है। तिथि के बजाय इंस्टेंट, जिसे मुझे काम करना आसान लगता है।

संबंधित मुद्दे