เครื่องมือใด ๆ สำหรับวัตถุจาวาเพื่อวัตถุแผนที่? [ปิด]


231

ฉันพยายามแปลง DO เป็น DTO โดยใช้ java และค้นหาเครื่องมืออัตโนมัติก่อนเริ่มเขียนเอง ฉันแค่อยากรู้ว่ามีเครื่องมือฟรีใด ๆ ที่เหมือนกันหรือไม่


1
แจ็คสัน (ห้องสมุด JSON) new ObjectMapper().convertValue(...)มีวิธีการ แจ็คสันยังมีการสนับสนุนคำอธิบายประกอบและคำอธิบายประกอบ - มิกซ์ดังนั้นฉันจึงคิดว่ามันเป็นตัวเลือกที่ดีมาก
Simon Forsberg

1
นี่คือบทความที่มีกรอบงานที่แตกต่างกันและการเปรียบเทียบประสิทธิภาพ baeldung.com/java-performance-mapping-frameworks
คริสเตียน

คำตอบ:


105

คุณอาจจะลองรถดันดิน

Dozer เป็น mapper Java Bean ไปยัง Java Bean ที่คัดลอกข้อมูลซ้ำจากวัตถุหนึ่งไปยังอีก โดยทั่วไป Java Beans เหล่านี้จะมีประเภทที่ซับซ้อนแตกต่างกัน

Dozer สนับสนุนการทำแผนที่คุณสมบัติอย่างง่ายการทำแผนที่ประเภทที่ซับซ้อนการทำแผนที่สองทิศทางการทำแผนที่โดยนัยที่ชัดเจนรวมถึงการทำแผนที่แบบเรียกซ้ำ ซึ่งรวมถึงแอตทริบิวต์การรวบรวมการแมปที่ต้องการการแมปที่ระดับองค์ประกอบด้วย


24
เวลานานมากหลังจากนั้นฉันมาอัพเดทฉันหวังว่าความคิดเห็นของฉันจะอ่าน: ตอนนี้ Dozer ดูเหมือนจะตายแล้วและตัวเลือกที่ดีคือการใช้ MapStruct มันง่ายมาก (รองรับหมายเหตุ), รวดเร็ว (ไม่มีการสะท้อนกลับ) ) และดูเหมือนปลอดภัย (ในขณะนี้) นี่รวมอยู่ในรายการ @Pascal Thivent แล้ว แต่ฉันแนะนำ (แม้ว่าฉันจะมีปัญหาบางอย่างจากการใช้มันพร้อมกับ lombok)
อเล็กซ์

2
ดูเหมือนว่ารถดันจะฟื้นขึ้นมาพร้อมกับรุ่น 6: mvnrepository.com/artifact/com.github.dozermapper/dozer-core
tkruse

394

มีห้องสมุดอยู่แถวนั้น:

  • Commons-BeanUtils : ConvertUtils -> วิธีการยูทิลิตี้สำหรับการแปลงค่าสเกลาร์สตริงเป็นวัตถุของคลาสที่ระบุ, สตริงอาร์เรย์เป็นอาร์เรย์ของคลาสที่ระบุ

  • Commons-Lang : ArrayUtils -> การดำเนินการกับอาร์เรย์อาร์เรย์ดั้งเดิม (เช่น int []) และอาร์เรย์ wrapper ดั้งเดิม (เช่น Integer [])

  • กรอบงาน Spring : Spring ได้รับการสนับสนุนที่ยอดเยี่ยมสำหรับ PropertyEditors ซึ่งสามารถใช้ในการแปลง Objects เป็น / จาก Strings

  • Dozer : Dozer เป็นตัวแมปเปอร์ Java Bean ที่ทรงพลังและใช้งานง่ายที่จะทำการคัดลอกข้อมูลซ้ำจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง โดยทั่วไป Java Beans เหล่านี้จะมีประเภทที่ซับซ้อนแตกต่างกัน

  • ModelMapper : ModelMapper เป็นเฟรมเวิร์กการแม็พอ็อบเจ็กต์อัจฉริยะที่แม็พอ็อบเจ็กต์กับกันและกันโดยอัตโนมัติ มันใช้วิธีการที่ใช้หลักการประชุมเพื่อทำแผนที่วัตถุในขณะที่จัดเตรียม API การปรับโครงสร้างใหม่ที่ปลอดภัยสำหรับการจัดการกรณีการใช้งานเฉพาะ

  • MapStruct : MapStruct เป็นตัวสร้างโค้ดเวลาคอมไพล์สำหรับการแม็พ bean ส่งผลให้รวดเร็ว (ไม่มีการใช้การสะท้อนกลับหรือคล้ายกัน) การแม็พการพึ่งพาน้อยลงและการพิมพ์ที่ปลอดภัยชนิดที่รันไทม์

  • Orika : Orika ใช้การสร้างรหัสไบต์เพื่อสร้างการทำแผนที่อย่างรวดเร็วด้วยค่าใช้จ่ายน้อยที่สุด

  • เซลมา : คอมไพล์ไทม์โค้ด - ไดนาโมสำหรับการแมป

  • JMapper : การสร้าง Bean mapper โดยใช้ Annotation, XML หรือ API (ดูเหมือนว่าจะตายแล้วอัปเดตล่าสุดเมื่อ 2 ปีที่แล้ว)

  • Smooks : ตลับหมึก Smooks JavaBean ช่วยให้คุณสามารถสร้างและเติมข้อมูลวัตถุ Java จากข้อมูลข้อความของคุณ (เช่นผูกข้อมูล) (แนะนำโดยsuperfilinในความคิดเห็น) (ไม่อยู่ภายใต้การพัฒนาที่ใช้งานอยู่)

  • Commons-Convert : Commons-Convert มีจุดประสงค์เพื่อให้ห้องสมุดเดียวที่ทุ่มเทให้กับงานของการแปลงวัตถุประเภทหนึ่งไปยังอีกประเภทหนึ่ง ขั้นตอนแรกจะเน้นที่การแปลงเป็น Object เป็น String และ String to Object (ดูเหมือนว่าจะตายอัปเดตล่าสุด 2010)

  • Transmorph : Transmorph เป็นห้องสมุด java ฟรีที่ใช้ในการแปลงวัตถุ Java ชนิดหนึ่งเป็นวัตถุประเภทอื่น (มีลายเซ็นอื่นอาจแปร) (ดูเหมือนว่าจะตายอัปเดตล่าสุด 2013)

  • EZMorph : EZMorph เป็นไลบรารี java อย่างง่ายสำหรับการแปลงวัตถุเป็นวัตถุอื่น รองรับการแปลงแบบดั้งเดิมและวัตถุสำหรับอาร์เรย์หลายมิติและการแปลงด้วย DynaBeans (ดูเหมือนจะตายอัปเดตล่าสุดปี 2008)

  • Morph : Morph เป็นเฟรมเวิร์ก Java ที่ช่วยลดความสามารถในการทำงานร่วมกันภายในของแอ็พพลิเคชัน เมื่อข้อมูลไหลผ่านแอปพลิเคชันจะมีการแปลงหลายครั้ง Morph จัดเตรียมวิธีมาตรฐานในการปรับใช้การแปลงเหล่านี้ (ดูเหมือนว่าจะตายอัปเดตล่าสุด 2008)

  • Lorentz : Lorentz เป็นกรอบการแปลงแบบ object-to-object ทั่วไป มันมี API ง่าย ๆ ในการแปลงวัตถุ Java ประเภทหนึ่งเป็นวัตถุประเภทอื่น (ดูเหมือนจะตาย)

  • OTOM : ด้วย OTOM คุณสามารถคัดลอกข้อมูลจากวัตถุใด ๆ ไปยังวัตถุอื่นได้ ความเป็นไปได้ไม่มีที่สิ้นสุด ยินดีต้อนรับสู่ "Autumn" (ดูเหมือนจะตาย)


ไม่มีรายการที่รองรับการเพิ่มความคิดเห็น :(
ravinikam

1
Commons-Convert ดูเหมือนจะไม่ใช่แค่อยู่เฉยๆ แต่ตอนนี้หายไปหมดแล้ว ...
Jim Ferrans

ที่จริงแล้วถ้าคุณต้องการเพิ่ม Moo ในรายการของคุณฉันสามารถลบคำตอบของฉันได้เนื่องจากคำตอบของคุณนั้นสมบูรณ์กว่ามาก ;)
Geoffrey Wiseman

3
ตัวเลือกอื่นสำหรับ Java 8+: erchu.github.io/bean-cp (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนโครงการนี้)
Rafal

1
@TmTron: เสร็จแล้วและฉันแก้ไขคำตอบเพื่อลบการประท้วงและอ้างอิง repo URL (เนื่องจากหน้าหลักยังคงอ้างถึง 0.7.5)
patric.schenke

31

อีกอันหนึ่งคือ Orika - https://github.com/orika-mapper/orika

Orika เป็นเฟรมเวิร์กการแม็พ Java Bean ที่คัดลอกข้อมูลซ้ำ (จากความสามารถอื่น ๆ ) ซ้ำ ๆ จากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง มันจะมีประโยชน์มากเมื่อพัฒนาแอพพลิเคชั่นแบบหลายชั้น

Orika มุ่งเน้นไปที่การทำงานอัตโนมัติให้ได้มากที่สุดในขณะที่ให้การปรับแต่งผ่านการกำหนดค่าและส่วนขยายตามต้องการ

Orika ช่วยให้นักพัฒนาสามารถ:

  • ทำแผนที่วัตถุที่ซับซ้อนและมีโครงสร้างอย่างลึกซึ้ง
  • "แบน" หรือวัตถุ "ขยาย" โดยการแมปคุณสมบัติที่ซ้อนกันกับคุณสมบัติระดับบนสุดและในทางกลับกัน
  • สร้าง mappers on-the-fly และใช้การปรับแต่งเพื่อควบคุมการทำแผนที่บางส่วนหรือทั้งหมด
  • สร้างตัวแปลงสำหรับการควบคุมการแมปของชุดวัตถุเฉพาะที่ใดก็ได้ในกราฟวัตถุ - ตามประเภทหรือตามชื่อคุณสมบัติที่ระบุ
  • จัดการพร็อกซีหรือวัตถุที่ได้รับการปรับปรุง (เช่นของ Hibernate หรือเฟรมเวิร์กจำลองต่าง ๆ )
  • ใช้การทำแผนที่สองทิศทางกับการกำหนดค่าเดียว
  • แมปอินสแตนซ์ของคลาสคอนกรีตที่เหมาะสมสำหรับคลาสนามธรรมเป้าหมายหรืออินเทอร์เฟซ
  • จัดการการแมปย้อนกลับ
  • จัดการกับการประชุมที่ซับซ้อนเกินข้อกำหนด JavaBean

Orika ใช้การสร้างรหัสไบต์เพื่อสร้างโปรแกรมแมปรวดเร็วด้วยค่าใช้จ่ายน้อยที่สุด


2
คุณสามารถให้คำสองสามคำเกี่ยวกับ orika - สิ่งที่ทำให้แตกต่างจากคนอื่น ๆ
Olimpiu POP

มันอาจเร็วกว่า Dozer มาก - Dozer เงียบช้า
Ondrej Bozek

21

ModelMapperเป็นอีกหนึ่งห้องสมุดที่ควรค่าใช้จ่าย การออกแบบของ ModelMapper นั้นแตกต่างจากไลบรารี่อื่น ๆ

  • แมปโมเดลวัตถุโดยอัตโนมัติโดยจับคู่คุณสมบัติต้นทางและปลายทางอย่างชาญฉลาด
  • จัดเตรียม API การแมปที่ปลอดภัย refactoring ที่ใช้รหัสจริงเพื่อแมปฟิลด์และวิธีการแทนที่จะใช้สตริง
  • ใช้การกำหนดค่าตามแบบแผนสำหรับการจัดการสถานการณ์จำลองแบบง่าย ๆ

ตรวจสอบเว็บไซต์ ModelMapper สำหรับข้อมูลเพิ่มเติม:

http://modelmapper.org


13

ใช้ Apache คอมมอนส์ beanutils:

static void copyProperties(Object dest, Object orig) คัดลอกค่าคุณสมบัติจาก bean ต้นทางไปยังปลายทาง bean สำหรับทุกกรณีที่ชื่อคุณสมบัติเหมือนกัน

http://commons.apache.org/proper/commons-beanutils/


3
ใช่แล้ว แต่คุณสมบัติที่อยู่ในถั่วแหล่งที่มา แต่ไม่ได้อยู่ในถั่วปลายทางจะถูกละเว้นเพียง ขอบคุณ anyways Pablojim :) ฉันคิดว่าฉันต้องไปกับ Dozer เนื่องจากเรามีชื่อคุณสมบัติที่แตกต่างกันสำหรับ DO และ DTO :(
ravinikam

1
ยุติธรรมเพียงพอ - ฉันไม่รู้สิ่งนี้ ... รายการของ Pascal ค่อนข้างน่าประทับใจ!
Pablojim


3

ผมแนะนำให้คุณลองJMapper กรอบ

เป็น Java bean ไปยัง Java bean mapper ช่วยให้คุณสามารถดำเนินการผ่านข้อมูลแบบไดนามิกด้วยคำอธิบายประกอบและ / หรือ XML

ด้วย JMapper คุณสามารถ:

  • สร้างและเพิ่มวัตถุเป้าหมาย
  • ใช้ตรรกะเฉพาะกับการทำแผนที่
  • จัดการไฟล์ XML โดยอัตโนมัติ
  • ใช้ความสัมพันธ์ 1 ถึง N และ N เป็น 1
  • ใช้การแปลงที่ชัดเจน
  • ใช้การกำหนดค่าที่สืบทอดมา

2

ฉันยินดีที่จะเพิ่มหมู่เป็นตัวเลือกถึงแม้ว่าฉันจะลำเอียงอย่างชัดเจน: http://geoffreywiseman.github.com/Moo/

มันง่ายมากที่จะใช้สำหรับกรณีง่าย ๆ เหมาะสมสำหรับกรณีที่ซับซ้อนมากขึ้นแม้ว่าจะมีบางพื้นที่ที่ฉันสามารถจินตนาการถึงการปรับปรุงให้ซับซ้อนยิ่งขึ้นไปอีก


2

คุณยังสามารถลองทำแผนที่กรอบงานตาม Dozer แต่ด้วยการประกาศการแมป Excel พวกเขามีเครื่องมือและคุณสมบัติเจ๋ง ๆ เพิ่มเติม ตรวจสอบที่http://openl-tablets.sf.net/mapper

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.