[JAVA] Introduction de Dozer to Play Framework

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.

environnement

Qu'est-ce que Dozer

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.

Se préparer à introduire Play

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
}

Injecter

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.

finalement

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

Introduction de Dozer to Play Framework
Comment installer Play Framework 2.6 pour Mac
Comment utiliser BootStrap avec Play Framework
Etude Play Framework
Publier sur Slack à partir de Play Framework 2.8 (Java)
Conseils pour Play Framework2.5 (Java)
Test d'étude de Play Framework
jouer des notes personnelles de cadre
Comment utiliser Play Framework sans utiliser l'activateur de sécurité
Base de données de mémos d'étude Play Framework ①
Java pour jouer avec Function
Notes personnelles de First Play Framework
Fonction de validation dans Play Framework
Présentation du client gRPC aux rails
Play Framework Study Memo Database ②Lire
Création de l'environnement de développement Play Framework 2.6 (Java)
Play Framework Study Momo DB Update
Double soumission de mesures avec Play Framework
Lancer les tâches planifiées et crontab