জ্যাকএক্সবি দ্বারা উত্পাদিত @XMLRootElement নেই


209

আমি এফপিএমএল (ফাইনান্সিয়াল প্রোডাক্টস মার্কআপ ল্যাঙ্গুয়েজ) সংস্করণ 4.5 থেকে জাভা ক্লাস উত্পন্ন করার চেষ্টা করছি। একটি টন কোড তৈরি করা হয়েছে, তবে আমি এটি ব্যবহার করতে পারি না। একটি সাধারণ দস্তাবেজ সিরিয়াল করার চেষ্টা করছি এটি আমি পেয়েছি:

javax.xml.bind.MarshalException
  - with linked exception: [com.sun.istack.SAXException2: unable
  to marshal type
  "org.fpml._2008.fpml_4_5.PositionReport"
  as an element because it is missing an
  @XmlRootElement annotation]

আসলে কোনও শ্রেণীর কাছে @ XMLRootElement টিকা নেই, তাই আমি কী ভুল করতে পারি ?. আমি xjc (JAXB 2.1) কে fpml-main-4-5.xsd এ নির্দেশ করছি, এরপরে সব ধরণের অন্তর্ভুক্ত রয়েছে।

উত্তর:


261

অন্যরা ইতিমধ্যে যা বলেছে বা ইঙ্গিত করেছে তাতে একত্রিত হওয়ার জন্য, জ্যাকএক্সবি এক্সজেসি যে বিধি দ্বারা @XmlRootElementজেনারেট হওয়া শ্রেণিতে টীকাগুলি রাখার সিদ্ধান্ত নেবে না তা নির্দোষ নয় ( এই নিবন্ধটি দেখুন )।

@XmlRootElementবিদ্যমান কারণ জ্যাকএক্সবি রানটাইমের নির্দিষ্ট প্রদত্ত বস্তু মার্শাল / আনমারশাল করার জন্য নির্দিষ্ট তথ্য প্রয়োজন, বিশেষত এক্সএমএল উপাদানটির নাম এবং নাম স্থান। মার্শেলারকে আপনি কেবল কোনও পুরানো বস্তু পাস করতে পারবেন না। @XmlRootElementএই তথ্য সরবরাহ করে।

টীকাগুলি কেবল একটি সুবিধা, তবে - জ্যাকএক্সবি এর প্রয়োজন হয় না। এর বিকল্প হ'ল JAXBElementমোড়কের জিনিসগুলি ব্যবহার করা , যা @XmlRootElementকোনও টীকাকর্ষণ নয় বরং কোনও অবজেক্টের আকারে একই তথ্য সরবরাহ করে ।

যাহোক, JAXBElement অবজেক্টগুলি নির্মাণের জন্য বিশ্রী, যেহেতু আপনাকে এক্সএমএল উপাদানটির নাম এবং নেমস্পেসটি জানা উচিত, যা ব্যবসায়িক যুক্তি সাধারণত না।

ধন্যবাদ, এক্সজেসি যখন একটি বর্গ মডেল উত্পন্ন করে, তখন এটি একটি ক্লাস নামেও উত্পন্ন করে ObjectFactory। এটি আংশিকভাবে জ্যাকএক্সবি ভি 1 এর সাথে পিছনের সামঞ্জস্যের জন্য রয়েছে, তবে এটি এক্সজেসির জন্য উত্পন্ন কারখানার পদ্ধতিগুলি রাখে যা JAXBElementআপনার নিজস্ব সামগ্রীর চারপাশে মোড়ক তৈরি করে। এটি আপনার জন্য এক্সএমএল নাম এবং নেমস্পেস পরিচালনা করে, তাই আপনার এটি নিয়ে চিন্তা করার দরকার নেই। আপনার যা প্রয়োজন তা খুঁজে পাওয়ার জন্য আপনাকে কেবল ObjectFactoryপদ্ধতিগুলি (এবং বড় স্কিমার জন্য, সেগুলির মধ্যে শত শতও হতে পারে) দেখতে হবে।


15
বিশেষ কেস সমাধান: আপনি যখন ক্লাস প্রজন্মের জন্য ব্যবহৃত এক্সএসডি সংশোধন করতে পারেন: এই উত্তরে প্রদত্ত লিঙ্কটি পড়ার পরে আমার ক্ষেত্রে সমাধানটি ছিল ক্লাস উত্পন্ন করার জন্য ব্যবহৃত এক্সএসডি ফাইলটি সংশোধন করা: আমি মূল উপাদানটির সংজ্ঞাটিকে একটিতে পরিবর্তন করেছি কোনও প্রকারের separetely সংজ্ঞায়নের পরিবর্তে ইনলাইনড সংজ্ঞা। এটি JAXB কে এই উপাদানটি @XMLRootElement হিসাবে সেট করতে দেয় যা মূল উপাদানটির জন্য আগে ব্যবহৃত এলিমেন্ট টাইপ দিয়ে সম্ভব ছিল না।
আর্থার

2
<scowl> মূল উপাদানকে ইনলাইন প্রকারে পরিবর্তন করা, তবে সমস্ত শ্রেণিকে মূল ধরণের অভ্যন্তরীণ শ্রেণীতে পরিণত করে। এছাড়াও, মূল উপাদানটি নিজেই মূল উপাদানটির পরে সংজ্ঞায়িত করা হলেও (স্কিমার দ্বারা স্পষ্টতই অনুমোদিত) জ্যাকএক্সবি এখনও @ এক্সএমএল রুটইলিমেন্টের সাথে টিকা দেবে না।
পাভেল ভেসেলভ

10
অর্থাত্ new ObjectFactory().createPositionReport(positionReport)প্রত্যাবর্তনJAXBElement<PositionReport>
ভাইকিংস্টিভ

17
যদি জেনারেটেড অবজেক্টফ্যাক্টরি পদ্ধতিটি এমন কোনও পদ্ধতি তৈরি না করে যা আর্গুমেন্টকে একটিতে আবৃত করে JXBElement? আমার ক্ষেত্রে, কারখানার পদ্ধতিটি 0-arity এবং কেবল একটি newবস্তু ফেরায় returns (কিছু ক্লাসে জ্যাকএক্সবেলেট র‌্যাপার সহায়ক এবং অন্যকে কেন দেওয়া হয় না?) আমি অনুমান করি সে ক্ষেত্রে আমাদের অবশ্যই র‌্যাপারটি তৈরি করতে হবে?
কার্ল জি

1
@ কার্লজি আমি একই পরিস্থিতিতে রয়েছি - আমার ক্লাসগুলিতে কোনও এক্সএমএল রুটইলেট বা জ্যাকসবিলেট উপস্থিত নেই। আপনি কি এই মামলার সমাধান খুঁজে পেয়েছেন?
মিকেল মারাশে

68

এটি ইতিমধ্যে উপরে লিঙ্ক করা ব্লগ পোস্টের নীচে উল্লেখ করা হয়েছে তবে এটি আমার জন্য ট্রিটের মতো কাজ করে:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(new JAXBElement<MyClass>(new QName("uri","local"), MyClass.class, myClassInstance), System.out);

আমি চিহ্নিত উত্তরটি পছন্দ করি তবে এটি আমার পক্ষেও কার্যকর।
পেড্রো দুসো

1
কি jcউপরে স্নিপেট মধ্যে?
অরুণ 12

3
@ArunRaj এটা JAXBContext ক্লাস হয়
সামুদ্রি মত্স্যবিশেষ

51

উপরের উত্তরগুলির মধ্যে একটিতে ইঙ্গিত হিসাবে, আপনি যদি আপনার XSD তে এর ধরণটিকে একটি নামকৃত ধরণ হিসাবে সংজ্ঞায়িত করা হয় তবে আপনি আপনার মূল উপাদানটিতে একটি এক্সএমএলআরলেটমেন্ট পাবেন না, কারণ সেই নামযুক্ত প্রকারটি আপনার এক্সএসডি-তে অন্য কোথাও ব্যবহার করা যেতে পারে। এটিকে বেনামে টাইপ করার চেষ্টা করুন, পরিবর্তে:

<xsd:element name="myRootElement" type="MyRootElementType" />

<xsd:complexType name="MyRootElementType">
...
</xsd:complexType>

তোমার থাকতে পারে:

<xsd:element name="myRootElement">
    <xsd:complexType>
    ...
    <xsd:complexType>
</xsd:element>

1
এটা আমার পক্ষে সত্য নয় আমার প্রকারটি বেনামে রয়েছে (আমার মূল উপাদানটির মধ্যে এম্বেড করা হয়েছে) এবং কোনও এক্সএমএল রুটএলমেন্ট টীকা উত্পন্ন হয় না। কোন ধারণা?
মিকেল মারাছে

38

আনমারশেলিংয়ের জন্য @XMLRootElement এর দরকার নেই - যদি কেউ আনমারশালার # আনমারশাল 2 পরামিতি ফর্ম ব্যবহার করে।

সুতরাং, পরিবর্তে যদি না:

UserType user = (UserType) unmarshaller.unmarshal(new StringReader(responseString));

এক করা উচিত:

JAXBElement<UserType> userElement = unmarshaller.unmarshal(someSource, UserType.class);
UserType user = userElement.getValue();

পরবর্তী কোডটির জন্য ইউজারটাইপ শ্রেণির স্তরে @XMLRootElement টিকা প্রয়োজন হবে না।


2
স্ক্যাফম্যান, গারনার্ড এট আল দ্বারা উল্লিখিত জ্যাকএক্সলেমে মোড়ানো না করে - আপনি কী এমন কোনও বস্তু মার্শাল করার সমান মার্জিত উপায় জানেন যা XMLRootElement নেই?
ক্রিস

4
+1 পুরোপুরি কাজ করে! আরও স্বচ্ছতার জন্য একটি সম্পাদনা ... আপনার সমাধানে 'সোমারসোর্স' খুব অস্পষ্ট শব্দ। বিস্তারিতভাবে জানাতে: জ্যাক্সবিলেট << টার্গেটক্লেজ> রুট = আনমারশালারআউনমারশাল (নতুন স্ট্রিমসোর্স (নতুন ফাইল ("কিছু.এক্সএমএল")), টার্গেটক্লাজ.ক্লাস);
সুপারনোভা

4
'সোমারসোর্স' এর আরও বিশদ বিবরণ:String pathname = "file.xml"; InputStream stream = new FileInputStream(pathname); JAXBContext jaxbContext = JAXBContext.newInstance(UserType.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLEventReader someSource = factory.createXMLEventReader(stream); JAXBElement<UserType> userElement = jaxbUnmarshaller.unmarshal(someSource, UserType.class); UserType user = userElement.getValue();
স্টিভ পিচারস

21

জো এর উত্তর (জো 26 জুন '09 এ 17:26) এটি আমার জন্য করে। এর সহজ উত্তরটি হ'ল আপনি যদি কোনও জ্যাক্সবিলেট মার্শাল করেন তবে @XMLRootElement টীকাটির অনুপস্থিতি কোনও সমস্যা নয়। আমাকে যে বিষয়টি বিভ্রান্ত করেছে তা হ'ল জেনারেটেড অবজেক্টফ্যাক্টির 2 টি ক্রিয়েমাইআরলেটমেন্ট উপাদান রয়েছে - প্রথমটি কোনও প্যারামিটার নেয় না এবং মোড়কযুক্ত বস্তু দেয়, দ্বিতীয়টি মোড়কানো বস্তু নেয় এবং এটিকে জ্যাক্সবিলেমে আবৃত করে দেয় এবং জ্যাক্সব্লেমেন্ট জরিমানা করে যে মার্শালিং করে। এখানে আমি যে বেসিক কোডটি ব্যবহার করেছি তা এখানে রয়েছে (আমি এই বিষয়ে নতুন, সুতরাং এই উত্তরটিতে কোডটি সঠিকভাবে ফর্ম্যাটেড না করা হলে ক্ষমাপ্রার্থী), মূলত লিঙ্কের পাঠ্য থেকে আঁকানো :

ObjectFactory objFactory = new ObjectFactory();
MyRootElement root = objFactory.createMyRootElement();
...
// Set root properties
...
if (!writeDocument(objFactory.createMyRootElement(root), output)) {
    System.err.println("Failed to marshal XML document");
}
...

private boolean writeDocument(JAXBElement document, OutputStream output) {

  Class<?> clazz = document.getValue().getClass();
  try {
    JAXBContext context =
        JAXBContext.newInstance(clazz.getPackage().getName());
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.marshal(document, output);
    return true;

  } catch (JAXBException e) {
    e.printStackTrace(System.err);
    return false;
  }
}

1
আমার একটি কেস আছে যেখানে আমার অবজেক্টফ্যাক্টরি ক্লাস কেবলমাত্র পদ্ধতিগুলিকে সংজ্ঞায়িত করে যা নিয়মিত দৃষ্টান্তগুলিতে ফিরে আসে এবং JAXBElement উদাহরণগুলি না ...
মিকেল মারাচে

20

এক্সএসডি-তে বেস প্রকারের জন্য কীভাবে @ XMLRootElement শ্রেণি তৈরি করা যায় তা থেকে আপনি বাধ্যতামূলক ব্যবহারটি এই সমস্যার সমাধান করতে পারেন ?

মাভেনের সাথে এখানে একটি উদাহরণ রয়েছে

        <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>
                <schemaDirectory>src/main/resources/xsd</schemaDirectory>
                <packageName>com.mycompany.schemas</packageName>
                <bindingFiles>bindings.xjb</bindingFiles>
                <extension>true</extension>
            </configuration>
        </plugin>

binding.xjbফাইলের বিষয়বস্তু এখানে

<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="path/to/myschema.xsd" node="/xs:schema">
        <jxb:globalBindings>
            <xjc:simple/>
        </jxb:globalBindings>
    </jxb:bindings>
</jxb:bindings>

3
আসলে, বাইন্ডিং.এক্সজেবি ফাইলটিতে <xjc: সরল> ব্যবহার করে কৌশলটি কার্যকর হয়েছে। আপনি যদি মার্শালিং কোড বা আপনার ডাব্লুএসডিএল পরিবর্তন করতে না চান তবে দুর্দান্ত সমাধান। দ্রষ্টব্য যে এক্সজেসি: সাধারণ সংগ্রহকারীদের জন্য বিভিন্ন পদ্ধতির নাম (বহুবচন) উত্পন্ন করে (উদাহরণস্বরূপ getOrder এর পরিবর্তে getOrders)
ডিভিটিওভার

10

আপনি জানেন যে উত্তরটি অবজেক্টফ্যাক্টরি () ব্যবহার করা use এখানে কোডের একটি নমুনা আমার জন্য কাজ করেছে :)

ObjectFactory myRootFactory = new ObjectFactory();

MyRootType myRootType = myRootFactory.createMyRootType();

try {

        File file = new File("./file.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(MyRoot.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        //output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        JABXElement<MyRootType> myRootElement = myRootFactory.createMyRoot(myRootType);

        jaxbMarshaller.marshal(myRootElement, file);
        jaxbMarshaller.marshal(myRootElement, System.out);

    } catch (JAXBException e) {
        e.printStackTrace();
    }

আপনার বক্তব্য ... আমি কীভাবে নেস্টেড উপাদানগুলির জন্য জ্যাক্সবিলেট <?> তৈরি ... () পদ্ধতি ব্যবহার করব? উদাহরণস্বরূপ: <SOAP-ENV: শিরোনাম> <wsse: সুরক্ষা> <wsse: ব্যবহারকারীর নাম টোকেন> </ wsse: ব্যবহারকারী নাম টোকেন> </ wsse: সুরক্ষা> </ SOAP-ENV: শিরোনাম> আমি পেয়েছি: "মার্শাল টাইপ" ব্যবহারকারীর নাম টোকেনটাইপ " একটি উপাদান কারণ এটি একটি @XmlRootElement টীকা অনুপস্থিত "হিসাবে
অ্যাঞ্জেলিনা

6

এটি আমাদের পক্ষেও কাজ করছে না। তবে আমরা একটি বহুলাংশে উদ্ধৃত নিবন্ধ পেয়েছি যা কিছু ব্যাকগ্রাউন্ড যুক্ত করেছে ... আমি পরের ব্যক্তির জন্য এখানে এটি লিঙ্ক করব: http://weblogs.java.net/blog/kohsuke/archive/2006/03 /why_does_jaxb_p.html


এটি আমার জন্য ভাল কাজ করেছে, আপনাকে ধন্যবাদ। আমি এটিও দেখতে পেলাম যে আমি এর মধ্য দিয়ে যাওয়ার প্রক্রিয়ায় আমি ভুল জ্যাকএক্সবি অবজেক্টটি (আমি ভাবার মতো মূলটি নয়) মার্শাল করছি। আমি জ্যাকএক্সবিলেট তৈরি করতে ভুলে গিয়েছিলাম এবং আমি যে বাইজেন্টফ্যাক্টরি ক্লাসের বাইন্ডিং থেকে পেয়েছি তা থেকে কেবল ফিরে আসা বস্তুটি মার্শাল করার চেষ্টা করছিলাম। এটি মূলত বিষয়টি পুরোপুরি যত্ন নিয়েছে (যদি কেউ একই সমস্যার বিরুদ্ধে লড়াই করে তবে)।
জো বানে

1
404: "আমরা দু: খিত জাভা ডটকম সাইটটি বন্ধ হয়ে গেছে .net জাভা.নেটে হোস্ট করা বেশিরভাগ ওপেন সোর্স প্রকল্পগুলি স্থানান্তরিত করা হয়েছে।"
ত্রিস্তান


6

দু'দিন ধরে চলাচল করার পরে আমি সমস্যার সমাধান খুঁজে পেয়েছি You আপনি ক্লাসগুলির জন্য কাজ করতে অবজেক্টফ্যাক্টরি ক্লাসটি ব্যবহার করতে পারেন যার @XMLRootElement নেই । জ্যাকএক্সবিলেমেন্টের চারপাশে মোড়ানোর জন্য ওজেক্টফ্যাক্টির ওভারলোডেড পদ্ধতি রয়েছে।

পদ্ধতি: 1 অবজেক্টের সহজ সৃষ্টি করে।

পদ্ধতি: 2 @JAXBElement দিয়ে অবজেক্টটি মোড়বে

Javax.xML.bind.MarshalException এড়ানোর জন্য সর্বদা পদ্ধতি: 2 ব্যবহার করুন - লিঙ্কযুক্ত ব্যতিক্রম একটি @XMLRootElement টীকা অনুপস্থিত।

দয়া করে নীচের নমুনা কোডটি সন্ধান করুন

পদ্ধতি: 1 অবজেক্টের সহজ সৃষ্টি করে

public GetCountry createGetCountry() {
        return new GetCountry();
    }

পদ্ধতি: 2 @JAXBElement দিয়ে অবজেক্টটি মোড়বে

 @XmlElementDecl(namespace = "my/name/space", name = "getCountry")
 public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
        return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
    }

ওয়ার্কিং কোড নমুনা:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
WebServiceTemplate springWSTemplate = context.getBean(WebServiceTemplate.class);

GetCountry request = new GetCountry();
request.setGuid("test_guid");

JAXBElement<GetCountryResponse> jaxbResponse = (JAXBElement<GetCountryResponse>)springWSTemplate .marshalSendAndReceive(new ObjectFactory().createGetCountry(request));

GetCountryResponse response = jaxbResponse.getValue();

বসন্তের ওয়েবসার্চিস টেমপ্লেটের সাথে কোড রেফারেন্স দেওয়ার জন্য ধন্যবাদ যেহেতু এটি বেশ কিছুদিন ধরে বের করার জন্য সংগ্রাম করে যাচ্ছিল!
আরআরআর_জে

5

যদি আমার এই সমস্যাটির অভিজ্ঞতা কাউকে ইউরেকা দেয়! মুহূর্ত .. আমি নিম্নলিখিত যুক্ত করব:

আমিও এই সমস্যাটি পেয়ে যাচ্ছিলাম, যখন আমি একটি এক্সএসডি ফাইল ব্যবহার করেছি যা আমি ইন্টেলিজিজের "জেনারেট এক্সএসডি থেকে ইনস্ট্যান্স ডকুমেন্ট থেকে জেনারেট করুন" মেনু বিকল্পটি ব্যবহার করে তৈরি করেছি।

যখন আমি এই সরঞ্জামটির সমস্ত ডিফল্ট গ্রহণ করেছি, এটি একটি এক্সএসডি ফাইল তৈরি করেছে যা যখন jaxb এর সাথে ব্যবহৃত হয়, জাভা ফাইলগুলি নং দিয়ে উত্পন্ন করে @XmlRootElement। রানটাইমে যখন আমি মার্শাল করার চেষ্টা করেছি তখন আমি এই প্রশ্নে যেমন আলোচনা করেছি তেমন ব্যতিক্রম পেয়েছি।

আমি ইন্টেলজে সরঞ্জামটিতে ফিরে গিয়ে "ডেসগিন টাইপ" ড্রপ ডাউন-এ ডিফল্ট বিকল্পটি দেখেছি (যা আমি অবশ্যই বুঝতে পারি নি .. এবং এখনও আমি সত্যবাদী না হলে তা না করে) ছিল:

ডিজাইন প্রকার:

"স্থানীয় উপাদান / গ্লোবাল জটিল ধরণের"

আমি এটিকে পরিবর্তন করেছিলাম

"স্থানীয় উপাদান / প্রকার"

, এখন এটি একটি (যথেষ্ট পরিমাণে) বিভিন্ন এক্সএসডি উত্পন্ন করে, যা @XmlRootElementজ্যাক্সবি-র সাথে ব্যবহারের সময় তৈরি করে । আমি এর ইন এবং আউটগুলি বুঝতে পারি তা বলতে পারি না তবে এটি আমার পক্ষে কাজ করে।


4

মাভেন বিল্ডের সাহায্যে আপনি এটি যুক্ত করতে পারেন @XmlRootElement টীকা

"সাথেjaxb2-basics-annotate " প্লাগ-ইন।

আরও তথ্য দেখুন: দেখুন

জ্যাকএক্সবি ব্যবহার করে এক্সএমএল স্কিমা থেকে ক্লাস উত্পন্ন করতে মাভেনকে কনফিগার করুন

এবং জ্যাক্সবি এক্সজেসি কোড জেনারেশন


4

জ্যাকএক্সবেলিমেন্টের মোড়কগুলি এমন ক্ষেত্রে কাজ করে যেখানে @XmlRootElementজ্যাকএক্সবি দ্বারা উত্পাদিত হয় না। এই মোড়কগুলি ObjectFactoryদ্বারা উত্পাদিত শ্রেণিতে উপলব্ধ maven-jaxb2-plugin। যেমন:

     public class HelloWorldEndpoint {
        @PayloadRoot(namespace = NAMESPACE_URI, localPart = "person")
        @ResponsePayload
        public JAXBElement<Greeting> sayHello(@RequestPayload JAXBElement<Person> request) {

        Person person = request.getValue();

        String greeting = "Hello " + person.getFirstName() + " " + person.getLastName() + "!";

        Greeting greet = new Greeting();
        greet.setGreeting(greeting);

        ObjectFactory factory = new ObjectFactory();
        JAXBElement<Greeting> response = factory.createGreeting(greet);
        return response;
      }
 }

3

আপনি কি এভাবে আপনার এক্সএসডি পরিবর্তন করার চেষ্টা করেছিলেন?

<!-- create-logical-system -->
<xs:element name="methodCall">
  <xs:complexType>
    ...
  </xs:complexType>
</xs:element>

এটি আমার পক্ষে জেডিকে 1.7u71 নিয়ে কাজ করেছে। একটি শীর্ষ স্তরের উপাদান xjc দ্বারা @XMLRootElement বরাদ্দ পেয়েছে। প্রথমদিকে আমার কাছে কেবলমাত্র শীর্ষ স্তরের জটিল ধরণের ছিল। জ্যাকএক্সবেলেট জড়ো করা সহজ কুরুচিপূর্ণ।
সার্জ মেরজলিয়াকভ

1

এটি সলিউশন করার জন্য আপনার জেনারেটেলমেন্টপ্রেটিটি মিথ্যা হিসাবে সেট করে ডাব্লুএসিম্পোর্টের সাথে সংকলনের আগে একটি এক্সএমএল বাইন্ডিং কনফিগার করতে হবে।

     <jaxws:bindings wsdlLocation="LOCATION_OF_WSDL"
      xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
      xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
         <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    <jaxws:bindings  node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='NAMESPACE_OF_WSDL']">
      <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xjc:generateElementProperty>false</xjc:generateElementProperty> 
      </jxb:globalBindings>
  </jaxws:bindings>
</jaxws:bindings>

<jaxb:bindings> ... <jaxws:bindings> ... </jaxws:bindings> ... </jaxb:bindings>
মোড়কের

0

বিষয়টি বেশ পুরানো তবে এন্টারপ্রাইজ ব্যবসায়িক প্রসঙ্গে এখনও প্রাসঙ্গিক। ভবিষ্যতে সহজেই আপডেট করার জন্য আমি এক্সএসডিএস এড়ানোর চেষ্টা করেছি। এখানে আমার সমাধানগুলি ..

1. বেশিরভাগই xjc:simpleযথেষ্ট

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    jxb:extensionBindingPrefixes="xjc">

    <jxb:globalBindings>
        <xjc:simple/> <!-- adds @XmlRootElement annotations -->
    </jxb:globalBindings>

</jxb:bindings>

এটি বেশিরভাগই এক্সএসডি সংজ্ঞা আমদানির জন্য এক্সএমএলরুট উপাদান তৈরি করে।

২. আপনার jaxb2-maven-pluginফাঁসি কার্যকর করুন

আমি সম্মুখীন হয়েছি যে আপনি যদি এক্সএসডি প্রতি এক্সিকিউশন সংজ্ঞা পরিবর্তে একাধিক এক্সএসডি সংজ্ঞা থেকে ক্লাস তৈরি করার চেষ্টা করেন তবে এটি একটি বিশাল পার্থক্য করে।

সুতরাং আপনার যদি একাধিকের সাথে কোনও সংজ্ঞা <source>থাকে তবে কেবল তাদের বিভক্ত করার চেষ্টা করুন:

          <execution>
            <id>xjc-schema-1</id>
            <goals>
              <goal>xjc</goal>
            </goals>
            <configuration>
              <xjbSources>
                <xjbSource>src/main/resources/xsd/binding.xjb</xjbSource>
              </xjbSources>
              <sources>
                <source>src/main/resources/xsd/definition1/</source>
              </sources>
              <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

          <execution>
            <id>xjc-schema-2</id>
            <goals>
              <goal>xjc</goal>
            </goals>
            <configuration>
              <xjbSources>
                <xjbSource>src/main/resources/xsd/binding.xjb</xjbSource>
              </xjbSources>
              <sources>
                <source>src/main/resources/xsd/definition2/</source>
              </sources>
              <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

জেনারেটর এই সত্যটি ধরবে না যে একটি শ্রেণি পর্যাপ্ত হতে পারে এবং তাই প্রতিটি কার্যকরকরণের জন্য কাস্টম ক্লাস তৈরি করে। এবং ঠিক আমার যা প্রয়োজন তা ঠিক আছে;)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.