2010-11-06 10 views
11

मैं परियोजना है कि डीटीओ वस्तुओं में डेटाबेस संस्थाओं धर्मान्तरित पर काम कर रहा हूँ। ऐसा करने के लिए प्रत्येक कनवर्टर के लिए एक विशेष कनवर्टर क्लास का उपयोग किया जाता है।फ्रेमवर्क वस्तुओं


मैं उन चीजों का सरलीकृत उदाहरण प्रदान कर रहा हूं जो हम कर रहे हैं। मैं जानबूझकर कोड स्पष्टता के लिए सेटर्स/गेटर्स और कुछ अन्य चीजों को याद करता हूं।

class Car { 
    String number; 
    Driver driver; 
} 

class Driver { 
    String name; 
    License license; 
} 

class License { 
    String serial; 
    Date expired; 
} 

और यह सोचते हैं कि हम डीटीओ वस्तु निम्नलिखित की जरूरत है:

class DriverDTOConverter { 
    DriverDTO convert(Car car) { 
     DriverDTO driverDto = new DriverDTO(); 
     driverDto.carNumber = car.number; 
     driverDto.name = car.driver.name; 
     driverDto.licenseSerial = car.driver.license.serial; 
     return driverDto; 
    } 
} 

:

class DriverDTO { 
    String name; 
    String carNumber; 
    String licenseSerial; 
} 

हम कनवर्टर वर्ग के अनुसार तैयार करते

तो यहाँ लगातार संस्थाएं हैं

और थोड़ा और अधिक जटिल उदाहरण:

class CarDTO { 
    String number; 
    String driverName; 
    LicenseDTO driverLicense; 
} 

class LicenseDTO { 
    String serial; 
} 

class CarDTOConverter { 
    CarDTO convert(Car car) { 
     CarDTO carDto = new CarDTO(); 
     carDto.number = car.number; 
     carDto.driverName = car.driver.name; 
     LicenseDtoConverter c = new LicenseDtoConverter(); 
     carDto.driverLicense = c.convert(car.driver.license); 
     return carDto; 
    } 
} 

class LicenseDtoConverter { 
    LicenseDTO convert(License license) { 
     LicenseDTO licenseDto = new LicenseDTO(); 
     licenseDto.serial = license.serial; 
     return licenseDto; 
    } 
} 

यह बहुत समय लगता है, इसलिए मुझे आश्चर्य है कि अगर कोई ढांचा है जिसके कि काम के लिए responsbility ले सकता है। और मुझे केवल इसे संपत्ति फ़ाइलों या एनोटेशन के साथ कॉन्फ़िगर करने की आवश्यकता होगी।

Smth कि

तो संपत्ति फ़ाइल द्वारा किए गए की तरह:

DriverDto <--> Car { 
carNumber = number; 
name = driver.name;    
licenseSerial = driver.license.serial; 
} 

CarDTO <--> Car { 
number = number; 
driverName = driver.name; 
driverLicense = driver.license; 
} 

LicenseDTO <--> License { 
license = license; 
} 

या संभव एनोटेट इकाई

@Converted(Car.class) 
class DriverDTO { 
    @Associated("driver.name") 
    String name; 
    @Associated("number") 
    String carNumber; 
    @Associated("driver.license.serial") 
    String licenseSerial; 
} 

महत्वपूर्ण आवश्यकता के उदाहरण है कि यह किसी भी प्रतिबिंब का उपयोग नहीं करना चाहिए। सभी एनोटेशन या संपत्ति फ़ाइलें संकलन या precompile मंच और बाईटकोड या स्रोत कोड उत्पन्न किया जाना चाहिए पर संकलित किया जाना चाहिए।

मैं अगर किसी को भी मुझे इस तरह के एक ढांचे को इंगित कर सकते हैं बहुत खुशी होगी। यदि यह अभी भी विकासशील है तो मैं इसके निर्माण में खुशी से भाग लेगा।

उत्तर

5

आपको Dozer - जावा बीन से बीन मैपर की जांच करनी चाहिए। उपयोग करने में आसान, विस्तार करने में आसान है।

+0

Thx मैं इस पर एक पहले देखो ले लिया है। यह वही चीज है जो मैं चाहता था अगर हम इस बात पर विचार न करें कि यह प्रतिबिंब का उपयोग करता है। वैसे भी मैं जवाब को सही के रूप में चिह्नित करता हूं। यदि कोई और अधिक शक्तिशाली ढांचे का सुझाव दे सकता है तो मैं खुश रहूंगा और अपना "सही" उत्तर विकल्प बदल दूंगा। – Zalivaka

+0

डोजर से परिचित हो लें दौरान मैं लिंक http://stackoverflow.com/questions/1432764/any-tool-for-java-object-to-object-mapping निम्नलिखित के साथ प्रस्तावित किया गया था। यह किसी ऐसे व्यक्ति के लिए सहायक हो सकता है जो उस प्रश्न में रूचि रखता है। – Zalivaka

3

आप ModelMapper देख सकते हैं।

यह डोज़र और अन्य से अलग है जिसमें यह समझदारी से ऑब्जेक्ट मॉडल मैपिंग द्वारा आवश्यक कॉन्फ़िगरेशन की मात्रा को कम करता है। जहां कॉन्फ़िगरेशन की आवश्यकता होती है, मॉडलमैपर एक रिफैक्टरिंग सुरक्षित API प्रदान करता है जो स्ट्रिंग संदर्भ या एक्सएमएल का उपयोग करने के बजाय गुणों और मानों को मैप करने के लिए वास्तविक कोड का उपयोग करता है।

चेक बाहर ModelMapper साइट अधिक जानकारी के लिए: डोजर के

http://modelmapper.org

0

एक वैकल्पिक, आपको दिलचस्प लग सकती है कि jDTO बाइंडर, है वास्तव में उपयोग करने के लिए आसान है और यह सबसे लोकप्रिय बैकएंड साथ एकीकरण प्रदान करता है कंटेनर।

jDTO Binder

0

आप MapStruct जो वास्तव में उपयोग के इस मामले एक संकलन समय कोड जनरेटर है में रुचि हो सकती (अस्वीकरण: मैं इस परियोजना पर काम कर रहा हूँ)।

MapStruct के रूप में, एक का निर्माण समय उपकरण है यह प्रतिबिंब का उपयोग नहीं करता है और न ही क्रम निर्भरता की तरह की आवश्यकता है। आप इस तरह एक अंतरफलक की घोषणा करने की जरूरत है: निर्माण (Maven के माध्यम से या अपने आईडीई में उदा) के दौरान

@Mapper 
public interface CarMapper { 

    CarMapper INSTANCE = Mappers.getMapper (CarMapper.class); 

    @Mapping(source="number", target="carNumber") 
    @Mapping(source="driver.name", target="name") 
    @Mapping(source="driver.license.serial", target="licenseSerial") 
    CarDto carToCarDto(Car car); 

    DriverDto driverToDriverDto(Driver driver); 
} 

, MapStruct कि इंटरफ़ेस जो मूल रूप से अपने मूल हाथ से लिखा कोड की तरह दिखता है के एक कार्यान्वयन उत्पन्न होगा।

आप रुचि रखते हैं, तो आप reference guide में और अधिक जानकारी प्राप्त कर सकते हैं।