2012-09-06 19 views
8

में जेएक्सबी (xjc) जेनरेटेड क्लासेस का उपयोग करें, मैं में Rest-Webservice का उपयोग कर रहा हूं। Web ServiceJSON और XML को संभाल सकता है, API को XSD के रूप में वर्णित किया गया है। इसलिए मैंने का उपयोग XSD से कक्षाएं उत्पन्न करने के लिए किया था और फिर मैंने अपने उदाहरणों से JSON उत्पन्न करने के लिए जैक्सन JSON प्रोसेसर का उपयोग किया।एंड्रॉइड

समस्या यह है कि JAXB (xjc) JAXB एनोटेशन के साथ कक्षाएं उत्पन्न करता है और Android उनको संभाल नहीं सकता है। मैंने अपने एंड्रॉइड प्रोजेक्ट में jaxb-api.jar जोड़ने की कोशिश की लेकिन Dalvik कोर क्लास का उपयोग नहीं करेगा।

मेरे पहले कार्यान्वयन के लिए मैंने मैन्युअल रूप से एनोटेशन हटा दिए। लेकिन अब XSD अपडेट किया गया था और यह हर बार ऐसा नहीं करना चाहता है।

क्या आपको कोई समस्या है कि इस समस्या को बेहतर तरीके से कैसे संभालना है? क्या एनोटेशन के बिना jaxb/xjc का उपयोग करने की संभावना है या क्या कोई अन्य कोड जेनरेटर है जो ऐसा कर सकता है? क्या आप जावा कक्षाओं से एनोटेशन को हटाने का एक आसान तरीका जानते हैं (भले ही वे कई लाइनों में मुद्रित हों)? क्या AndroidEclipse परियोजनाओं के लिए कोई प्रोजेक्ट सेटिंग है, जो दालविक को मूल libs को अनुमति देता है?

THX, cathixx

उत्तर

2

अब, मैं निम्नलिखित ant स्क्रिप्ट के साथ सभी एनोटेशन टिप्पणी करके अपने आप से इसे हल:

<replaceregexp flags="g" byline="false"> 
    <regexp pattern="(@Xml[A-Za-z0-9]+(\([^)]+\))?|import javax\.xml\.bind\.annotation\.[A-Za-z0-9.]+;)[ \t]*(\r?\n)"/> 
    <substitution expression="/*\1*/\3"/> 
    <fileset dir="path/to/files"> 
    <include name="*.java"/> 
    </fileset> 
</replaceregexp> 
+0

यह मेरे लिए एक बड़ी मदद हो सकता है अगर यह काम करता है। हालांकि, मैं चींटी के लिए नया हूँ। क्या आप इस स्क्रिप्ट को किसी नए व्यक्ति के लिए उपयोग करने के लिए थोड़ा और संदर्भ दे सकते हैं? उदाहरण के लिए, मेरे पास एक निर्देशिका में .java फ़ाइलों का एक सेट है जिसे परिवर्तित करने की आवश्यकता है, और मेरे पास एंटी इंस्टॉल है। आगे क्या? –

5

मैं cathixx का जवाब काम करने के लिए के बाद से मैं कुछ अतिरिक्त शोध करना था मैं चींटी के लिए नया हूँ, इसलिए मैं इसे दूसरों की मदद के लिए साझा करूंगा।

ये निर्देश की तरह कोड के साथ जावा फ़ाइलें ले जाएगा:

import javax.xml.bind.annotation.XmlElement; 

@XmlRootElement 
public class Response {... 

... और इन घटनाओं बाहर टिप्पणी है, तो ऐसा लगता है कि:

/*import javax.xml.bind.annotation.XmlElement;*/ 

/*@XmlRootElement*/ 
public class Response {... 

सबसे पहले, (एक फ़ाइल build.xml बना सकते हैं या जो भी आप इसे कॉल करना चाहते हैं - .xml होना चाहिए) एक नई ग्रहण परियोजना में (एक "सामान्य" परियोजना ठीक है)।

फिर, build.xml फ़ाइल में निम्न पाठ जोड़ें:

<?xml version="1.0"?> 
<project 
    name="CommentOutXmlAnnotations" 
    basedir="." 
    default="commentOutXmlAnnotations" > 

<!-- This Ant script comments out the following lines from the Java files in this directory: 
    import javax.xml.bind.annotation.*; 
    @Xml* 
--> 
    <target 
     name="commentOutXmlAnnotations"   
     description="Run" > 
      <replaceregexp 
       byline="false" 
       flags="g" > 
       <regexp pattern="(@Xml[A-Za-z0-9]+(\([^)]+\))?|import javax\.xml\.bind\.annotation\.[A-Za-z0-9.]+;)[ \t]*(\r?\n)" /> 
       <substitution expression="/*\1*/\3" /> 
       <fileset dir="." > 
        <include name="*.java" /> 
       </fileset> 
      </replaceregexp>   
    </target> 
</project> 

रखो आप build.xml फ़ाइल के रूप में एक ही निर्देशिका में के लिए एक्सएमएल आयात और एनोटेशन बाहर टिप्पणी करना चाहते हैं *.java फ़ाइलें।

ग्रहण में build.xml फ़ाइल पर राइट-क्लिक करें, और "एएस बिल्ड के रूप में चलाएं" पर क्लिक करें।

आप उत्पादन की तरह देखना चाहिए:

Buildfile: D:\Eclipse_Projects\StripAnnotations\build.xml 
commentOutXmlAnnotations: 
BUILD SUCCESSFUL 
Total time: 403 milliseconds 

... और एक्सएमएल आयात और एनोटेशन आपकी फ़ाइलों के बाहर टिप्पणी की जानी चाहिए।

हो गया!

नोट: यदि आप निर्माण की सभी उप-निर्देशिकाओं में सभी *.java फ़ाइलों को शामिल करना चाहते हैं।xml फ़ाइल (उदाहरण के लिए, बाहर टिप्पणी करने के लिए सभी XML एनोटेशन/एकाधिक संकुल में JAXB वर्गों में से एक गुच्छा के लिए उत्पन्न आयात), के लिए fileset टैग बदलने के लिए:

<fileset dir="." > 
    <include name="**/*.java" /> 
</fileset> 
+0

तो सबसे पहले, भयानक काम! हालांकि मैं कुछ मुद्दों में भाग रहा हूं। यह javax.xml.bind.JAXBElement को फ़िल्टर नहीं करता है। XmlElementRefs के कुछ पैटर्नों पर टिप्पणी की जाती है, अर्थात् जब किसी कारण से बच्चे की वस्तुएं होती हैं। कुछ XmlEnumValues ​​पर टिप्पणी नहीं की जाती है, लेकिन अन्य हैं। @XmlElements या तो नहीं है। – spy

+0

धन्यवाद! Javax.xml.bind.JAXBElement के लिए, नियमित अभिव्यक्ति से ".annotation \" भाग को हटाने का प्रयास करें - मुझे यह नहीं लगता कि यह पैकेज संरचना में कम (javax.xml.bind। *) खोज रहा है। दूसरों के लिए, सुनिश्चित नहीं है कि कभी-कभी यह कुछ अवसरों के लिए क्यों काम करेगा और दूसरी बार ऐसा नहीं होगा। –

+0

@XmlRootElement को – spy