2012-01-30 14 views
8

का उपयोग करते हुए जावा कक्षाएं बनाते समय हैशकोड() और बराबर() उत्पन्न करना मैं जिस कोड पर काम कर रहा हूं वह jaxb2-maven-pluginorg.codehaus.mojo से XSD स्कीमा से जावा कक्षाएं उत्पन्न करने के लिए उपयोग कर रहा है। मैं उन वर्गों के लिए equals() और hashCode() विधियों को स्वचालित रूप से कार्यान्वित करने का एक तरीका ढूंढ रहा हूं, लेकिन ऐसा लगता है कि कोई रास्ता नहीं है। मुझे पता है कि अन्य JAXB2 मेवेन प्लगइन्स हैं जो ऐसा करते हैं (http://confluence.highsource.org/display/J2B/ उदाहरण के लिए होम), लेकिन मैं सोच रहा था कि अगर आप में से कोई भी इस मुद्दे का सामना कर रहा है और यदि कोई रास्ता है इसे ठीक करना मैं xjc लक्ष्य का उपयोग कर कक्षाएं उत्पन्न कर रहा हूं।एमएसओ जेएक्सबी 2 मेवेन प्लगइन

उत्तर

12

जेएक्सबी 2 मूल बातें जो आप उल्लेख कर रहे हैं maven-jaxb2-plugin की संपत्ति नहीं है, यह जेएक्सबी 2.x प्लगइन का एक स्टैंडअलोन सेट है जिसका उपयोग आप एक्सजेसी - या jaxb2-maven-plugin या जो कुछ भी कर सकते हैं।

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxb2-maven-plugin</artifactId> 
      <version>1.3.1</version> 
      <executions> 
       <execution> 
        <id>xjc</id> 
        <goals> 
         <goal>xjc</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <arguments> 
        <argument>-Xequals</argument> 
        <argument>-XhashCode</argument> 
       </arguments> 
      </configuration> 
      <dependencies> 
       <dependency> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-basics</artifactId> 
        <version>0.11.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

मैं क्या पूछना चाहता था - क्यों न केवल maven-jaxb2-plugin का उपयोग करें? कोडहॉस प्लगइन की तुलना में इसमें बहुत अधिक कार्यक्षमता है - जेएक्सबी 2 प्लगइन के लिए कॉन्फ़िगरेशन समर्थन सहित।

+0

मैं वास्तव में इसके लिए गया था! धन्यवाद :) – manub

+1

क्या आप वाकई यह काम कर रहे हैं? मुझे लगता है कि "लक्ष्य निष्पादित करने में विफल org.codehaus.mojo: jaxb2-maven-plugin: 1.5: xjc (xjc) प्रोजेक्ट XXX पर: अपरिचित पैरामीटर - बराबर" या "आर्टिफैक्ट नहीं मिला" मेरे द्वारा उपयोग किए जाने वाले संस्करणों के आधार पर। अन्य प्लगइन के लिए इसके प्रति सभी लिंक टूटा हुआ है। – ampofila

+0

@ampofila नहीं, मुझे इस विशिष्ट एक्सएमएल के बारे में निश्चित नहीं है, केवल जेएक्सबी 2-मूल बातें किसी विशिष्ट मेवेन प्लगइन पर निर्भर नहीं हैं। मैं केवल maven-jaxb2-प्लगइन का उपयोग करता हूं। प्लगइन को केंद्रीय मेवेन रेपो में होस्ट किया गया है, इसलिए यह निश्चित रूप से उपलब्ध है: http://mvnrepository.com/artifact/org.jvnet.jaxb2.maven2/maven-jaxb2-plugin मैं दस्तावेज़ सर्वर को पुनरारंभ कर रहा हूं। – lexicore

4

मैं आपके कोड में व्यावसायिक वस्तुओं के रूप में जेएक्सबी जेनरेटेड कक्षाओं का उपयोग करने से असहमत हूं। जेएक्सबी द्वारा जेनरेट की जाने वाली कक्षाएं बीन्स हैं जो कि अनिवार्य रूप से एक्सएमएल फ़ाइल से तत्व जानकारी को बीन के खेतों में ले जाने के लिए हैं। मैं व्यक्तिगत रूप से हमेशा अपनी एसओएपी सेवा को इन वास्तविक बीन कक्षाओं को अपने वास्तविक व्यावसायिक वस्तुओं में परिवर्तित करता हूं, क्योंकि एक्सएमएल-> जावा और इसके विपरीत रूपांतरण हर समय काला और सफेद नहीं होता है। ध्यान दें कि यह मेरी व्यक्तिगत राय है, और कुछ अन्य लोगों के लिए इस स्थिति में जो कुछ भी करते हैं उस पर वजन करने के लिए प्यार करेंगे।

हालांकि, अपने प्रश्न का उत्तर देने के लिए, एक अलग प्लग का उपयोग करें, या बस कुछ समान और हैशकोड विधियों के लिए अपना आईडीई उपयोग करें।

उम्मीद है कि मदद करता है।

संपादित करें:

मैं क्षमा याचना इस के लिए मेरे तर्क डाल करने के लिए, भूल गया था। आइए हम अपने प्रोजेक्ट के अगले संस्करण में कहें कि आप अपने जेएक्सबी जेनरेटेड क्लासेस में कुछ और व्यवहार जोड़ना चाहते हैं, लेकिन अपनी स्कीमा में कुछ बदलाव करना चाहते हैं। अब आप जेएक्सबी जेनरेटेड क्लासेस को पुन: उत्पन्न कर रहे हैं, पुराने व्यवहार को वापस डाल रहे हैं, और अपने आवेदन को मेरी राय में बग के लिए अधिक संवेदनशील बनाते हैं। जेएक्सबी जेनरेटेड क्लासेस को आपके एक्सएमएल स्कीमा प्रकार (और इस प्रकार आपके एसओएपी संदेश) को प्रतिबिंबित करना चाहिए, जो आपके व्यावसायिक तर्क नहीं हैं। उम्मीद है कि समझ में आता है।

+0

मैं उससे सहमत हूं, और हमारे पास अलग-अलग व्यावसायिक वस्तुएं हैं। मुझे मुख्य कारण लिखना होगा यूनिट परीक्षण लिखने के लिए, लेकिन टिप के लिए धन्यवाद! – manub

+1

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

+0

@ChrisEineke। – lexicore

2

तुम भी उपयोग कर एक fluent builder interface और मामले आप एक xmldsig कोर-स्कीमा संदर्भित कर रहे हैं (पीढ़ी प्रक्रिया को गति, कोई रूप में एक सूची फ़ाइल का संदर्भ (उत्पन्न JAXB कक्षाओं की हैंडलिंग की सुविधा) विचार करना चाह सकते डब्ल्यू 3 सी से रिमोट स्कीमा पूछे जाते हैं - उनके सर्वर आमतौर पर प्रतिक्रिया में देरी करते हैं)।

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxb2-maven-plugin</artifactId> 
      <version>1.5</version> 
      <dependencies> 
       <dependency> 
        <groupId>net.java.dev.jaxb2-commons</groupId> 
        <artifactId>jaxb-fluent-api</artifactId> 
        <version>2.0.1</version> 
        <exclusions> 
         <exclusion> 
          <groupId>com.sun.xml</groupId> 
          <artifactId>jaxb-xjc</artifactId> 
         </exclusion> 
        </exclusions> 
       </dependency> 
       <dependency> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-basics</artifactId> 
        <version>0.6.4</version> 
        <exclusions> 
         <exclusion> 
          <groupId>com.sun.xml</groupId> 
          <artifactId>jaxb-xjc</artifactId> 
         </exclusion> 
        </exclusions> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <goals> 
         <goal>xjc</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory> 
       <packageName>[your package name goes here]</packageName> 
       <outputDirectory>${build.directory}/generated/src/main/java</outputDirectory> 
       <bindingDirectory>${basedir}/src/main/resources/xsd</bindingDirectory> 
       <extension>true</extension> 
       <catalog>${basedir}/src/main/resources/xsd-catalog/catalog.cat</catalog> 
       <extension>true</extension> 
       <arguments>-Xfluent-api -Xequals -XhashCode -XtoString</arguments> 
      </configuration> 
     </plugin> 

यहाँ है कैसे सूची फ़ाइल की तरह दिखता है:

-- 
    sample catalog file. 

    double hyphens are used to begin and end a comment section. 
-- 

SYSTEM "http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" "xmldsig-core-schema.xsd" 

और यहाँ है xmldisg कोर-schema.xsd के लिए लिंक: http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd

कृपया ध्यान दें कि लिंक नहीं है टूटा - डब्ल्यू 3 सी सर्वर बस कुछ सेकंड में प्रतिक्रिया देरी कर रहा है। अगर मैं आपकी स्वचालित निर्माण प्रक्रिया के दौरान होता हूं, तो मुझे बहुत बोझिल हो सकता है, जिसमें जेएक्सबी पीढ़ी शामिल है।

1

मेरा उत्तर उन लोगों के लिए है जो अपने जेनरेट कोड पर तीसरे पक्ष निर्भरता का जोखिम नहीं उठा सकते हैं।

org.jvnet.jaxb2_commons:jaxb2-basics प्लगइन जेनरेट कोड में org.jvnet के बहुत सारे जोड़ता है और आपकी परियोजना org.jvnet.jaxb2_commons:jaxb2-basics-runtime पर निर्भर करेगी।

org.andromda.thirdparty.jaxb2_commons:commons-lang-plugin प्लगइन कोड उत्पन्न करता है जो commons-lang:commons-lang पर निर्भर करता है। स्थिति के आधार पर यह निर्भरता सहन करना आसान हो सकता है।

मुझे अंततः this source code मिला, इसे com.sun.xml.bind:jaxb-xjc में किसी बिंदु (संस्करण 2.2.4?) में शामिल किया जा सकता है, लेकिन तब तक मैं अपनी खुद की प्लगइन लिखने से कोई अन्य समाधान नहीं देख सकता।

पीएस: मैं confluence.highsource.org तक नहीं पहुंच सकता, मुझे 404 मिलते हैं। मुझे लगता है कि यह सहायक हो सकता है।

पीपीएस: मेरी स्थिति में, मेरे द्वारा बनाई जा रही एप्लिकेशन को ऐसे माहौल पर लक्षित किया गया है जिसमें जावा पुस्तकालयों (असंगत सुरक्षा प्रतिबंध) के बहुत सीमित सेट हैं। मैं इस तथ्य से थोड़ा निराश था कि jaxb2_commons में उत्पन्न स्रोत में org.jvnet निर्भरताओं का एक गुच्छा शामिल है, बस उबाऊ equals विधि जोड़ने के लिए। मैं जेवीनेट की रणनीति को समझ सकता हूं, उनके उपकरण बहुत शक्तिशाली हैं, मैं सिर्फ अखरोट को तोड़ने के लिए एक स्लेजहैमर का प्रयास कर रहा हूं। फिर भी, मुझे यह जानकर खेद हुआ कि मेरी स्थिति के लिए उपयुक्त उपकरण ढूंढना बहुत मुश्किल था।

+0

यह कहना महत्वपूर्ण है कि एंड्रोडा प्लगइन के साथ उपयोग करने का विकल्प '-Xcommons-lang' है। – logoff

2

यह करने का सबसे आसान तरीका है। कृपया अपनी आवश्यकताओं के अनुसार संस्करण अपडेट करें।

<plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>jaxb2-maven-plugin</artifactId> 
        <version>1.5</version> 
        <dependencies> 
         <dependency> 
          <groupId>org.jvnet.jaxb2_commons</groupId> 
          <artifactId>jaxb2-commons-lang</artifactId> 
          <version>2.3</version> 
         </dependency> 
        </dependencies> 
        <executions> 
         <execution> 
          <id>JAXB generate content classes</id> 
          <phase>generate-sources</phase> 
          <goals> 
           <goal>xjc</goal> 
          </goals> 
          <configuration> 
           <schemaDirectory>${project.basedir}/src/main/resources/schema</schemaDirectory> 
           <outputDirectory>${project.build.directory}/generated-sources/jaxb</outputDirectory> 
           <schemaFiles>**/*.xsd</schemaFiles> 
           <packageName>com.lexus.web.content.model</packageName> 
           <arguments>-Xcommons-lang</arguments> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
1

जेएक्सबी के लिए एक धाराप्रवाह-निर्माता प्लगइन भी है जो आवश्यक रूप से तृतीय-पक्ष कोड पर निर्भरता उत्पन्न नहीं करता है। इसके अलावा, यह एक वास्तविक "बिल्डर" डिज़ाइन पैटर्न है, जबकि "धाराप्रवाह-एपीआई" प्लगइन केवल जेनरेट किए गए वर्गों के लिए बिल्डर-जैसी विधियों को जोड़ता है। यह है: https://github.com/mklemm/jaxb2-rich-contract-plugin इसमें जेनरेटेड कक्षाएं अपरिवर्तनीय बनाने के विकल्प भी हैं और यह मौजूदा वस्तुओं की स्थिति को नए बिल्डर उदाहरण में कॉपी करने के तरीकों को उत्पन्न कर सकता है, जो "आंशिक" ऑब्जेक्ट प्रति का समर्थन भी करता है।