
مرحبا أيها القراء الأعزاء! أولئك الذين يطورون تطبيقات الويب في Java باستخدام إطار Spring ، والذين يعلقون على هذه التطبيقات ويهتمون فقط.
في مقال سابق ،
"Spring Boot Problem Solving with ManyToMany"أعطيت مثالاً على تطبيق اختبار فيه علاقة ثنائية الاتجاه ManyToMany بين فئتين. أعطت المقالة مثالاً عن حل مشكلة التكرار عند تلقي استجابة راحة باستخدام فئة DTO. اقترح القراء في التعليقات استخدام مكتبة
MapStruct لحل
مشكلة التكرار.
بعد مراجعة
الوثائق ، كنت مقتنعا بأن هذا شيء قوي حقا ، حيث يمكنك حل المهام المعقدة إلى حد ما لنقل البيانات بين الكائنات. MapStruct يحل مشكلة حلقات كذلك.
في هذه المقالة ، سأقدم مثالاً على حل نفس المشكلة كتطبيق Spring Boot باستخدام مكتبة MapStruct.
شفرة المصدر المتاحة في جيثب
بقي كيانات الأشخاص و SongPlayers على حالهم. خفضت الحروف والرسامين.
@Entity public class People { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String human;
@Entity public class SongPlayers { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String song;
نحن أيضا إنشاء واجهات مستودع لفئات الناس و SongPlayers.
@Repository public interface PeopleRepository extends JpaRepository<People, Long> { @Query("select h from People h where h.human=?1") List<People> searchByHuman(String human); List<People> findPeopleByHuman(String human); }
@Repository public interface SongPlayersRepository extends JpaRepository<SongPlayers, Long> { List<SongPlayers> findSongPlayersBySong(String song); List<SongPlayers> findSongPlayersByComposer(String composer); List<SongPlayers> findSongPlayersByPoet(String poet); }
نقوم أيضًا بإنشاء فصول DTO لـ People و SongPlayers ، والتي لا تبدو ضخمة جدًا. Getters و setters أنا أقل.
public class PeopleDTO { private long id; private String human; private RockGroups rockGroups; private List<SongPlayersDTO> songPlayersList;
public class SongPlayersDTO { private long id; private String song; private String composer; private String poet; private String album;
لوصف قاعدة نقل البيانات من الكائن المصدر إلى كائن DTO ، وإذا لزم الأمر ، نقوم بإنشاء واجهات معين لكل فئة تتطلب حماية ضد التكرار. ها هي PeopleMapper و SongPlayersMapper
@Mapper(uses = SongPlayersMapper.class) public interface PeopleMapper { PeopleMapper PEOPLE_MAPPER = Mappers.getMapper(PeopleMapper.class); @Mapping(source = "songItems", target = "songPlayersList") PeopleDTO fromPeople(People people); }
@Mapper public interface SongPlayersMapper { SongPlayersMapper SONG_PLAYERS_MAPPER = Mappers.getMapper(SongPlayersMapper.class); SongPlayersDTO fromSongPlayers(SongPlayers songPlayers); @InheritInverseConfiguration SongPlayers toSongPlayers(SongPlayersDTO songPlayersDTO); }
في مجلد الخدمة ، قم بإنشاء واجهات وتنفيذ فئات الخدمة ، والتي نضع بها طرق تلقي البيانات (سأقدمها للأشخاص).
public interface PeopleService { List<PeopleDTO> getAllPeople(); PeopleDTO getPeopleById(long id); People addPeople(People people); void delPeople(long id); ResponseEntity<Object> updPeople(People people, long id); List<RockGroups> getByHuman(String human); List<String> getSongByHuman(String human); }
@Service("peopleservice") public class PeopleServiceImpl implements PeopleService { @Autowired private PeopleRepository repository; @Override public List<PeopleDTO> getAllPeople() { List<PeopleDTO> peopleDTOList = new ArrayList<>(); List<People> peopleList = repository.findAll(); for (People people : peopleList){ peopleDTOList.add(PeopleMapper.PEOPLE_MAPPER.fromPeople(people)); } return peopleDTOList; }
في وحدات التحكم ، سنطبق هذه الأساليب وفقًا لذلك (مرة أخرى فقط للأشخاص)
@RestController @RequestMapping("/people") public class PeopleController { @Autowired private PeopleServiceImpl service; @GetMapping("/all") public List<PeopleDTO> getAllPeople(){ return service.getAllPeople(); }
من الحل أعلاه لمشكلة التكرار في علاقة ManyToMany ، يمكنني القول أن الخيار مع فئات DTO من المقالة السابقة والخيار مع مكتبة MapStruct من هذه المقالة تعمل أيضًا. مقارنةً بالإصدار السابق ، تم تبسيط فئة DTO إلى حد كبير ، لكن تمت إضافة واجهات Mapper. بشكل عام ، يمكن استخدام أي طريقة ، في الحالات البسيطة ، سأميل إلى الخيار الأول.
أشكر جميع المشاركين في المناقشة. في انتظار تعليقاتكم.
رابط
إلى المادة السابقة .
رابط
للمشروع على جيثب .
الأدب المستخدم:
- فيليبي جوتيريز برو ربيع الحذاء
- كريج جدران الربيع في العمل الإصدار الخامس