Zum Inhalt springen
Anjunar/ DOCS

Schemas und Regeln

Ein Schema listet die Properties, die eine Entity zeigt. Eine Regel pro Property entscheidet je Instanz, ob sie sichtbar ist und ob sie geschrieben werden darf.

Schema

Ein Companion, der es liefert

Das Companion-Objekt erweitert SchemaProvider und deklariert eine verschachtelte Klasse Schema. property wählt eine Property typsicher über ein Makro aus scala-reflect.

scala
import com.anjunar.json.mapper.provider.{DTO, EntityProvider} import com.anjunar.json.mapper.schema.{DefaultWritableRule, EntitySchema, SchemaProvider} class Article extends DTO with EntityProvider { @(JsonbProperty @field) var id: UUID = UUID.randomUUID() var version: Long = -1 @(JsonbProperty @field) var title: String = null @(JsonbProperty @field) var body: String = null @(JsonbProperty @field) var author: User = null } object Article extends SchemaProvider[Article.Schema] { class Schema extends EntitySchema[Article] { val title = property(_.title, classOf[DefaultWritableRule[Article]]) val body = property(_.body, classOf[AuthorRule[Article]]) val author = property(_.author) } }
Wirkung

Nur, was das Schema listet

Mit Schema wird eine nicht gelistete Property weder serialisiert noch deserialisiert, auch mit @JsonbProperty. Ohne Regel-Argument gilt DefaultRule: sichtbar, aber nur lesbar.

DefaultRule[E]
Sichtbar, nie schreibbar. Der Standard.
DefaultWritableRule[E]
Sichtbar und schreibbar.
VisibilityRule[E]
Eigene Regel: isVisible und isWriteable je Instanz und Property.
Regeln

Entscheidungen je Instanz

Eine Regel sieht Instanz und Property. Sie entsteht über die inject-Funktion und darf deshalb Abhängigkeiten im Konstruktor nehmen, etwa den aktuellen Benutzer.

scala
import com.anjunar.json.mapper.schema.VisibilityRule import com.anjunar.scala.universe.introspector.AbstractProperty class AuthorRule[E <: Article](identity: CurrentUser) extends VisibilityRule[E] { def isVisible(instance: E, property: AbstractProperty): Boolean = true def isWriteable(instance: E, property: AbstractProperty): Boolean = instance.author != null && instance.author.id == identity.id }
Unsichtbar heißt abwesend

Eine Property, die die Regel verbirgt, fehlt im JSON ganz, und eine, die sie nicht schreiben lässt, wird beim Eintreffen still ignoriert. Clients sehen dafür nie einen Fehler.