J'utilisais une bibliothèque appelée Dozer pour le développement à l'aide de Spring Framework, mais comme c'était une bibliothèque pratique, j'ai décidé de l'utiliser avec le Play Framework que j'utilise actuellement, j'ai donc écrit le code. La source créée est téléchargée sur GitHub.
Une bibliothèque qui mappe les données entre les objets. C'est très utile lors du passage de données entre les couches avec le framework MVC. Tout d'abord, regardons une implémentation normale qui n'utilise pas Dozer. Lorsque vous passez des données de la couche actuelle à la couche suivante, vous écrirez souvent du code comme celui-ci.
Cartographie normale
//Calque actuel
//Passer les données au bean de couche suivant
BeanB beanB = new BeanB();
beanB.field1 = beanA.field1;
beanB.field2 = beanA.field2;
beanB.field3 = beanA.field3;
.
.
.
//Traitement de la couche suivante
service.run(beanB);
Ce qui précède est un modèle simple, mais si le bean implémente un setter ou un getter, ou si le type est converti parce que le type est différent entre les beans, la lisibilité est médiocre et plus il y a de paramètres, plus le code est redondant. Ce sera. De plus, si le bean augmente ou diminue les paramètres, le mappage doit être modifié à chaque fois. Voici un exemple d'utilisation de Dozer.
Cartographie du bulldozer
//Calque actuel
//Cartographie des haricots par Dozer
Mapper mapper = new DozerBeanMapper();
BeanB beanB = mapper.map(beanA, BeanB.class);
//Traitement de la couche suivante
service.run(beanB);
Si vous transmettez l'objet source de la copie dans le premier argument de la méthode map et la classe de destination de la copie dans le deuxième argument, l'objet de classe de destination de la copie qui contient les données source de la copie sera renvoyé. En effet, Dozer mappe les données de la source de copie sur le paramètre du même nom de la destination de la copie. De plus, si le type prend en charge la conversion de type, la conversion de type sera effectuée automatiquement. Pour plus d'informations sur la prise en charge de la conversion de type, voir ici.
Essayons Dozer. J'ai créé une application qui saisit simplement le nom et le montant de l'écran et l'enregistre, je voudrais donc vous présenter Dozer. L'installation n'est pas particulièrement difficile car elle peut être utilisée simplement en l'ajoutant à build.sbt.
Tout d'abord, ajoutez ce qui suit à build.sbt et rechargez et mettez à jour.
libraryDependencies += "net.sf.dozer" % "dozer" % "5.5.1"
Après cela, vous pouvez générer DozerBeanMapper dans la couche qui utilise Dozer et l'utiliser, mais cette fois, je voudrais le définir dans DI. Créez une classe MappingModule qui hérite de AbstractModule et définissez les dépendances.
MappingModule
//importation omise
public class MappingModule extends AbstractModule {
@Override
protected void configure() {
bind(Mapper.class).to(DozerBeanMapper.class);
}
}
Enregistrez le MappingModule créé dans applications.conf.
application.conf
play.modules {
enabled += modules.MappingModule
}
Les beans utilisés dans chaque couche sont définis comme suit.
Haricot | couche |
---|---|
Form | Client - Controller |
Dto | Controller - Service |
Model | Service - Repository |
Injectez Mapper dans la classe que vous souhaitez utiliser Dozer. Puisque ce qui suit est la classe Controller, nous mappons les données de Form à Dto.
IndexController
package controllers;
//importation omise
public class IndexController extends Controller {
@Inject
private FormFactory formFactory;
@Inject
private Mapper mapper; //cette
@Inject
private IndexService service;
//Autres méthodes omises
public Result post() {
Form<IndexForm> f = formFactory.form(IndexForm.class).bindFromRequest();
IndexDto dto = mapper.map(f.get(), IndexDto.class); //Cartographie ici
switch(f.get().action){
case "regist":
service.regist(dto);
break;
case "delete":
service.delete(dto);
break;
default:
}
return ok(views.html.index.render(f, dto));
}
}
Après avoir effectué un RequestBind vers Form, les données sont mappées vers Dto et le traitement est déplacé vers la couche suivante (Service). La forme et Dto sont définis comme suit.
IndexForm
package forms;
public class IndexForm {
/**Action d'écran*/
public String action;
/**Nom*/
public String name;
/**Somme d'argent*/
public String amount;
/**Supprimer l'ID*/
public String id;
}
IndexDto
package dtos;
//importation omise
public class IndexDto {
/**Nom*/
public String name;
/**Somme d'argent*/
public BigDecimal amount;
/**Supprimer l'ID*/
public Long id;
/**Liste de données*/
public List<Person> personList;
}
Le type du montant et l'ID de suppression sont différents, mais la conversion de type est effectuée dans Mapper.
Puisque le serveur est réellement démarré et que l'opération est confirmée, la source est téléchargée sur GitHub. Dozer peut être personnalisé pour permettre le mappage entre des champs avec des noms différents et un mappage complexe, mais je n'ai pas pu écrire car je ne savais pas comment le définir dans Play. Je voudrais l'étudier et le mettre à jour.
Recommended Posts