2012-09-20 16 views
11

मुझे जेएक्सबी एक एक्सएमएल स्कीमा के लिए बाध्य कक्षाएं उत्पन्न करने के तरीके के साथ एक समस्या है (जो, परिशुद्धता के लिए, मैं संशोधित नहीं कर सकता)। मैं एक XSD मैप करना चाहते हैं: एक Joda समय LOCALDATE वस्तु के लिए दिनांक प्रकार और, here, here और here पढ़ने, मैं निम्नलिखित DateAdapter श्रेणी का निर्माण:जेएक्सबी, कस्टम बाइंडिंग्स, एडाप्टर 1.क्लास और जोडा-टाइम

public class DateAdapter extends XmlAdapter<String,LocalDate> { 
    private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd"); 

    public LocalDate unmarshal(String v) throws Exception { 
     return fmt.parseLocalDate(v); 
    } 

    public String marshal(LocalDate v) throws Exception { 
     return v.toString("yyyyMMdd"); 
    } 
} 

और मैं अपने वैश्विक बाध्यकारी फ़ाइल में निम्न जोड़ा :

[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[20,59] non-static method unmarshal(java.lang.String) cannot be referenced from a static context 
[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[24,59] non-static method marshal(org.joda.time.LocalDate) cannot be referenced from a static context 
:

<jaxb:globalBindings> 
     <jaxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date" 
      parseMethod="my.classes.adapters.DateAdapter.unmarshal" 
      printMethod="my.classes.adapters.DateAdapter.marshal" /> 
    </jaxb:globalBindings> 

समस्या यह है कि, जब मैं अपने प्रोजेक्ट को संकलित maven करने की कोशिश, यह निम्न त्रुटि के साथ विफल है

... और यह वह जगह है जहां चीजें अजीब होती हैं।

public class Adapter1 
    extends XmlAdapter<String, LocalDate> 
{ 


    public LocalDate unmarshal(String value) { 
     return (my.classes.adapters.DateAdapter.unmarshal(value)); 
    } 

    public String marshal(LocalDate value) { 
     return (my.classes.adapters.DateAdapter.marshal(value)); 
    } 

} 

.... जो संकलन त्रुटि का स्रोत है: JAXB एक वर्ग Adapter1 है जिसमें निम्न शामिल उत्पन्न करता है।

अब, मेरे सवाल कर रहे हैं:

  • जा रहा है कि मेरी एडाप्टर XmlAdapter अधिभावी है, मैं तरीकों स्थिर नहीं कर सकते हैं .... मैं यह कैसे से बचने के हैं?
  • क्या मैं एडाप्टर 1.class की पीढ़ी से पूरी तरह से बच सकता हूं ?? हो सकता है कि पैकेज-स्तरीय एनोटेशन XmlJavaTypeAdapters का उपयोग कर, और यदि हां, तो मैं इसे बिल्कुल कैसे कर सकता हूं ?? (जेएक्सबी पहले से ही एक पैकेज-info.java उत्पन्न करता है ....)

आशा है कि मैंने अपनी स्थिति स्पष्ट कर दी है।
धन्यवाद

उत्तर

7

आप XmlAdapter का विस्तार करने की जरूरत नहीं है।

बस पीओजेओ पर स्थिर तरीके बनाएं और यह काम करेगा।

उदाहरण:

public class DateAdapter { 
    private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd"); 

    public static LocalDate unmarshal(String v) throws Exception { 
     return fmt.parseLocalDate(v); 
    } 

    public static String marshal(LocalDate v) throws Exception { 
     return v.toString("yyyyMMdd"); 
    } 
} 
3

एक्सएमएलएडएप्टर को एक्सएमएल स्कीमा से उत्पन्न करते समय आपको XmlAdapter में स्थैतिक तरीकों में रूपांतरण के लिए तर्क डालना होगा। यह XmlAdapter है जो उस तर्क को उत्पन्न करता है जो तर्क उत्पन्न किया जा सकता है। मुझे पता है कि यह एक अजीब तंत्र है।

संपूर्ण उदाहरण

3

आप XmlAdapter जो प्रयोग किया जाता है जब आप JAXB के लिए अपने जावा मॉडल एनोटेशन करना चाहते हैं का विस्तार कर रहे हैं, कि एनोटेशन @XmlJavaTypeAdapter(Adapter1.class) माध्यम से है। आपके मामले के लिए आपको केवल स्थिर विधियों वाली कक्षा की आवश्यकता है जो XmlAdapter का विस्तार नहीं करता है। आपको पार्स विधि की आवश्यकता होगी (एक स्ट्रिंग और वापसी तिथि लें) और प्रिंट विधि (एक तिथि लें और एक स्ट्रिंग वापस करें) और यह इसके बारे में है।

3

मैं के रूप में उपयोगी इस समाधान http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html

आप तो एक एडाप्टर

package blog.jodatime; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import org.joda.time.DateTime; 

public class DateTimeAdapter 
    extends XmlAdapter<String, DateTime>{ 

    public DateTime unmarshal(String v) throws Exception { 
     //return new DateTime(v); - old solution that didn't properly handled the timezone 
     return DateTime.parse(v); 
    } 

    public String marshal(DateTime v) throws Exception { 
     return v.toString(); 
    } 

} 

पैदा करेगा अपने स्रोतों

में एक ब्लॉग/jodatime/package-info.java को परिभाषित करते हुए एनोटेशन के साथ इसे पंजीकृत पाया
@XmlJavaTypeAdapters({ @XmlJavaTypeAdapter(type = DateTime.class, value = JodaDateTimeJaxbAdapter.class) }) 
package blog.jodatime; 

import javax.xml.bind.annotation.adapters.*; 

import org.joda.time.*; 

तब आपको उम्मीद करनी चाहिए कि डेटटाइम का क्रमबद्धता बिना किसी अन्य परिवर्तन के किया जाता है, बस भूलना न भूलें @XmlRootElement के साथ अपनी कक्षा को एनोटेट करें।

+1

देखते हैं? मेरी एनोटेशन ओवरराइट हो जाएगी। –

17

मैं डब्लूएसडीएल के पहले संदर्भ में था: बिल्कुल कोई जावा नहीं, केवल एक डब्लूएसडीएल से सीएक्सएफ क्लाइंट उत्पन्न करें।

मैं लंबे समय से बदसूरत Adapter1.java के साथ फंस गया था, लेकिन मुझे समाधान there मिला।

आप पहले से समझाए गए कस्टम XMLAdapter का उपयोग करेंगे।

इस समस्या का प्रमुख वैश्विक बाध्यकारी फाइल करने के लिए xjc एक्सटेंशन जोड़ दिया गया था:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1"> 
    <jaxb:globalBindings> 
     <xjc:javaType adapter="com.xxx.tools.xjc.DateAdapter" 
     name="java.util.Date" xmlType="xs:dateTime" /> 
    </jaxb:globalBindings> 
</jaxb:bindings> 

xjc विस्तार xjc:javaType स्वीकार एडाप्टर पैरामीटर के उपयोग की अनुमति। कोई और स्थिर विधि की आवश्यकता नहीं है!

नोट यह केवल जैक्सबी 2.1+ के साथ काम करता प्रतीत होता है।

1

एक पूरा उदाहरण।

<jaxws:bindings wsdlLocation="YourWsdl" 
     xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     jxb:extensionBindingPrefixes="xjc"> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='YourTargetNameSpace']"> 
     <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <xjc:javaType adapter="com.xxx.your.package.DateAdapter" name="java.util.Date" xmlType="xs:dateTime" /> 
     </jxb:globalBindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

जावा क्लास प्लस:

package com.yourpackage; 

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

import javax.xml.bind.DatatypeConverter; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class DateAdapter extends XmlAdapter<String, Date> 
{ 

    @Override 
    public Date unmarshal(final String date) { 
     return DatatypeConverter.parseDate(date).getTime(); 
    } 

    @Override 
    public String marshal(final Date date) 
    { 
     Calendar calendar = new GregorianCalendar(); 
     calendar.setTime(date); 
     return DatatypeConverter.printDate(calendar); 
    } 

} 

प्लस pom.xml परिभाषा:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.version}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-basics</artifactId> 
      <version>0.6.4</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> 
       <defaultOptions> 
        <autoNameResolution>true</autoNameResolution> 
       </defaultOptions> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>${basedir}/src/main/resources/your.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-verbose</extraarg> 
          <extraargs>-xjc-npa</extraargs> 
          <extraarg>-xjc-Xsetters</extraarg> 
         </extraargs> 
         <bindingFiles> 
         <bindingFile>${basedir}/src/main/resources/binding.xml</bindingFile> 
         </bindingFiles> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
0

आप XmlAdapter और Joda साथ विस्तार करने के लिए की जरूरत नहीं है यह आपके bindings.xml है -टाइम v2, आपको स्थिर विधियों को लागू करने की भी आवश्यकता नहीं है, क्योंकि वे पहले से ही उपलब्ध कराए गए हैं। क्या होगा यदि मैं `xjc` के साथ मेरी` JAXB` कक्षाओं पैदा कर रहा हूँ

<jaxb:javaType xmlns="http://java.sun.com/xml/ns/jaxb" 
    name="org.joda.time.LocalDate" 
    xmlType="xs:date" 
    parseMethod="org.joda.time.LocalDate.parse" 
    printMethod="java.lang.String.valueOf" 
/> 

JAXB datatype converters for xs:date xs:time and xs:dateTime

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