জ্যাকসবি 2 এর অবজেক্টফ্যাক্টরি ক্লাসটি কী?


98

আমি জ্যাকএক্সবি ব্যবহারে নতুন, এবং আমি আমার এক্সএমএল স্কিমা থেকে ক্লাসের একটি সেট তৈরি করতে জ্যাক্সবি ২.১.৩ এর এক্সজেসি ব্যবহার করেছি। আমার স্কিমাতে প্রতিটি উপাদানের জন্য একটি বর্গ তৈরি করার পাশাপাশি এটি একটি অবজেক্টফ্যাক্টরি ক্লাস তৈরি করেছে।

এখানে সরাসরি উপাদানগুলিকে ইনস্ট্যান্ট করা থেকে বিরত থাকার কিছু নেই বলে মনে হচ্ছে

MyElement element = new MyElement();

টিউটোরিয়ালগুলি পছন্দ বলে মনে হচ্ছে

MyElement element = new ObjectFactory().createMyElement();

যদি আমি অবজেক্টফ্যাক্টরি.জভাতে সন্ধান করি তবে আমি দেখতে পাচ্ছি:

public MyElement createMyElement() {
    return new MyElement();
}

তাহলে কি ব্যাপার? কেন আমি এমনকি অবজেক্টফ্যাক্টরি ক্লাসটি প্রায় বজায় রাখা বিরক্ত করব? আমি ধরে নিয়েছি যদি আমি কোনও পরিবর্তিত স্কিমা থেকে পুনরায় সংকলন করতে পারি তবে এটি ওভাররাইটও হবে।


আমি এটির নকশাটি নির্ধারিত কিনা তা নিশ্চিত নই, তবে আমি জ্যাকএক্সবিসিটিসেক্সটেক্সট নির্মাণের জন্য অবজেক্টফ্যাক্টিকে একটি আদর্শ শ্রেণিটি খুঁজে পেয়েছি। আপনাকে সেখানে কয়েকটি ক্লাস গণনা করতে হবে এবং জ্যাকএক্সবি তাদের পদ্ধতিগুলি ইত্যাদি অনুসরণ করবে, তাই এগুলি শিকড়ের মতো কিছু। এবং অবজেক্টফ্যাক্টির সকল উপাদানগুলির রেফারেন্স রয়েছে, সুতরাং সমস্ত প্রাসঙ্গিক শ্রেণীর সাথে জ্যাকএক্সবিএনটেক্সট তৈরি করতে কেবল অবজেক্টফ্যাক্ট্রি.ক্লাস ব্যবহার করা যথেষ্ট।
vbezhenar

উত্তর:


68

পিছনের সামঞ্জস্যতা একমাত্র কারণ নয়। :- পি

আরও জটিল স্কিমার সাথে, যেমন কোনও উপাদানগুলির বিষয়বস্তু গ্রহণ করতে পারে এমন মানগুলির ক্ষেত্রে জটিল বাধা রয়েছে, কখনও কখনও আপনাকে প্রকৃত JAXBElementঅবজেক্ট তৈরি করতে হবে । এগুলি সাধারণত হাতে তৈরি করা তুচ্ছ নয়, সুতরাং create*পদ্ধতিগুলি আপনার জন্য কঠোর পরিশ্রম করে। উদাহরণ (এক্সএইচটিএমএল 1.1 স্কিমা থেকে):

@XmlElementDecl(namespace = "http://www.w3.org/1999/xhtml", name = "style", scope = XhtmlHeadType.class)
public JAXBElement<XhtmlStyleType> createXhtmlHeadTypeStyle(XhtmlStyleType value) {
    return new JAXBElement<XhtmlStyleType>(_XhtmlHeadTypeStyle_QNAME, XhtmlStyleType.class, XhtmlHeadType.class, value);
}

এভাবে আপনি কোনও <style>ট্যাগতে একটি <head>ট্যাগ পান:

ObjectFactory factory = new ObjectFactory();
XhtmlHtmlType html = factory.createXhtmlHtmlType();
XhtmlHeadType head = factory.createXhtmlHeadType();
html.setHead(head);
XhtmlStyleType style = factory.createXhtmlStyleType();
head.getContent().add(factory.createXhtmlHeadTypeStyle(style));

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


* কিছু কার্যকর করার জন্য * () তৈরির জন্য স্কিমা উপাদানটি কী (বা কত জটিল) তার একটি উদাহরণ / রেফারেন্স দিতে পারেন? আপনি আপনার JAXB উদাহরণ দিয়ে যে স্কিমার উল্লেখ করছেন তার অংশটি খুঁজে পেতে আমার সমস্যা হচ্ছে। যদি আমার স্কিমা পরে আরও জটিল হয়ে যায় তবে অবশ্যই এটির জন্য আমার নিজের জন্য এটির অংশটি পরিচালনা করতে খুব ভাল লাগবে, তবে এটি তৈরি করার ফলে * নিজের উপ-উপাদান তৈরি করা এমনকি বিরক্ত করে না ..
অ্যান্ড্রু কোলসন

আপনি যদি এক্সএইচটিএমএল 1.1 এবং এক্সএইচটিএমএল মডুলারাইজেশন 1.1 টার্বলগুলি ডাউনলোড করেন তবে আপনি "এসসিএইচএমএ" নামক ডিরেক্টরিগুলি পাবেন। সমস্ত .xsd ফাইল একই ডিরেক্টরিতে রাখুন। কিছু .xsd ফাইল w3.org/2001/xML.xsd আমদানি করবে ; আপনি xjc চালানোর সময় ফাইলটি ডাউনলোড করতে না চাইলে আপনি অবস্থানগুলি যথাযথভাবে সামঞ্জস্য করতে চান। [অবিরত]
ক্রিস জেস্টার-ইয়ং

[বিদ্রূপ] <x> এর বিষয়বস্তু নির্দিষ্ট করে .xsd এর নির্দিষ্ট অংশটি এই ক্ষেত্রে xhtml11-Model-1.xsd এ, xhtml.head.content গোষ্ঠীর অধীনে।
ক্রিস জেস্টার-ইয়াং

4
যাই হোক না কেন, কেউ আপনার মাথার দিকে বন্দুকের দিকে ইঙ্গিত করছে না যে আপনাকে অবশ্যই অবজেক্টফ্যাক্টরিটি ব্যবহার করতে হবে (যদিও আমি এটি ব্যবহার করা সহজ মনে করি) তবে আপনি যখন এমন কোনও ক্ষেত্রে আসেন যেখানে এটি সত্যিকারের উপকারী তখন আপনি এটি জানতে পারবেন। :-)
ক্রিস জেস্টার-ইয়াং

ধন্যবাদ! আমার ধারণা আমার স্কিমাটি যথেষ্ট জটিল নয়, তবে আমি এটি ভবিষ্যতের জন্য মনে রাখব। :) আমি জানতাম আমার কিছু মিস করা উচিত।
অ্যান্ড্রু কোলসন

40

@ ক্রিস উল্লেখ করেছেন যে, কখনও কখনও জ্যাকসবি পোগোদের সাথে কাজ করতে পারে না, কারণ স্কিমাটি ঠিক জাভাতে ম্যাপ করা যায় না। এই ক্ষেত্রে, JAXBElementঅতিরিক্ত ধরণের তথ্য সরবরাহের জন্য মোড়কের জিনিসগুলি প্রয়োজনীয়।

দুটি সাধারণ উদাহরণ রয়েছে যেটি আমি এখানে এসে পৌঁছেছি common

  • আপনি যদি এমন কোনও শ্রেণীর কোনও বস্তু মার্শাল করতে চান যাতে @XmlRootElementটীকা নেই। ডিফল্টরূপে এক্সজেসি কেবলমাত্র @XmlRootElementকিছু উপাদানের জন্য উত্পন্ন করে, অন্যের জন্য নয়। এর জন্য সঠিক যুক্তিটি কিছুটা জটিল, তবে আপনি XJC কে "সাধারণ বাইন্ডিং মোড"@XmlRootElement ব্যবহার করে আরও ক্লাস তৈরি করতে বাধ্য করতে পারেন

  • যখন আপনার স্কিমা বিকল্প গ্রুপ ব্যবহার করে। এটি বেশ উন্নততর স্কিমা ব্যবহার, তবে এক্সজেসি মোড়কের ভারী ব্যবহার করে প্রতিস্থাপক গোষ্ঠীগুলিকে জাভাতে অনুবাদ করে JAXBElement

সুতরাং একটি এক্সজেসি-উত্পন্ন বস্তু মডেল যা ভারী ব্যবহার করে JAXBElement(যে কোনও কারণেই হোক), আপনাকে সেই JAXBElementদৃষ্টান্তগুলি তৈরির একটি উপায় প্রয়োজন । উত্পাদিত ObjectFactoryএটি করা সবচেয়ে সহজ উপায়। আপনি এগুলি নিজেই তৈরি করতে পারেন তবে এটি করার জন্য এটি চতুর এবং ত্রুটি-প্রবণ।


অতিরিক্ত উদাহরণের জন্য ধন্যবাদ!
অ্যান্ড্রু কুলসন

4
বাহ, এটি একটি বিজয়ী উত্তর। +1
ক্রিস জেস্টার-ইয়ং

আমি ৯০% সময় হিসাবে এক্সএমএলআরটেলমেন্ট জেনারেট করতে অ্যানোক্স ব্যবহার করতে চাই যদি আমার কাছে একটি এলিমেট থাকে যা একটি জটিল টাইপকে বোঝায়, আমি এক্সএমএলআরলেট চাই (ভাল, আরও ১০০% যেমন আমি ব্যবহারের ক্ষেত্রে আঘাত করি নি যেখানে আমি এটি চাই না) তবুও)
ডিন হিলার 12'12

9

পিছনে সামঞ্জস্য, আমার ধারণা ...

http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :

... আর অবজেক্টফ্যাক্টরি। ক্রিয়েট এক্সওয়াইজেড নেই। এই কারখানার পদ্ধতিগুলির সাথে সমস্যাটি হ'ল তারা একটি পরীক্ষিত JAXBException ফেলে দেয়। এখন আপনি কেবল নতুন এক্সওয়াইজেড () করতে পারবেন, আর চেষ্টা / ব্লক ধরার দরকার নেই। (আমি জানি, আমি জানি, ... এটি "আমরা কী ভাবছিলাম !?" জিনিসগুলির মধ্যে এটি একটি) ...

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