Automatische Konvertierung von JSON Objekten zu Typen sicheren Id Objekten in Scala & Play

Typen-sichere Id Objekte?

Typen-sichere Id Objekte ermöglichen zu kompilierzeit sicherzustellen, dass die in einem Servicecall verwendeten Id Objekte dem erwarteten Typ entsprechen. Dies verhindert, dass die Parameter bspw. in der falschen Reihenfolge oder gar falsche Parameter Werte übergeben werden. Ein kleines Beispiel:

Ein Service zum Anlegen eines Benutzers besitzt bspw. folgendes Interface:

trait UserService {
	def createUser(groupId:Int, roleId: Int, someOtherId:Int)
}

Beim Aufruf dieses Services können leicht die Parameterwerte initial oder bei einem späteren Refactoring vertauscht werden, ohne dass ein Compiler Fehler erzwungen wird. Eine elegantere Lösung würde in etwa wie folgt aussehen:

case class GroupId(value:Int)
case class RoleId(value:Int)
case class SomeOtherId(value:Int)
trait UserService {
	def createUser(groupId:GroupId, roleId: RoleId, someOtherId:SomeOtherId)
}

Diese Typen-sichere Repräsentation der Id Objekte führt bei einem fehlerhaften Serviceaufruf zum ewünschten Compiler Fehler. 

 

Typen-sichere Id in Json Objekten

Im Zusammenhang mit Json Objekten und den im Play Framework zur Verfügung gestellten Formatters kann nun ein Typen-sicheres Json Objekt nicht mehr wie gewünscht automatisch formatiert werden:

case class Group(groupId:GroupId, name:String)

müsste wie folgt als Json Wert abgebildet werden:

{
	groupId: {
		value: 123
	},
	name: "aGroup"
} 

Die entspricht aber nicht unseren Erwartungen, in welchen wir das Objekt kompakter darstellen möchten, gegebenfalls mit Anbindung an ein Fremsystem gar auf die existierende Struktur angewiesen sind:

{
	groupId: 123,
	name: "aGroup"
}

 

Deshalb haben wir im Rahmen eines Projektes ein kleines Scala/Play Plugin erstellt, welches die Konvertierung der Json Objekte in die gewünschten Typen-sicheren Id Objekte entsprechend der definierten case classes ermöglicht. Dazu habe ich mich als Co-Author an folgendem Blog Beitrag beteiligt:

http://pietrotull.com/2014/11/13/json-values-to-typed-ids-in-scala-play/

Dieser Blog Beitrag beschreibt ebenfalls die technischen Details der Lösung.

 

Das Play Plugin steht auf unserer Github Seite zur Verfügung:

https://github.com/tegonal/play-json-typedid

 

Anregungen und Bemerkungen sind herzlich willkommen.

Post your comment

Comments

No one has commented on this page yet.

RSS feed for comments on this page | RSS feed for all comments