2016-08-09 41 views
0

Ich habe einen Controller eine Route wie 'POST/doit', der json Körper automatisch in eine Fallklasse in Tools (Jackson, etc.), mit Finatra so etwas wie diese gebaut wird analysiert Handhabung:Wie kann ich festlegen, dass ein Feld so leer bleibt, während Finatra eine Anfrage in eine Fallklasse analysiert?

class MyController extends Controller { 
    post("/doit") { request: MyRequest => 
    // something 
    } 
} 

case class MyRequest(
    id: String, 
    custom: String 
) 

Hier sind einige gültige Anfragen:

{ "id": "my id", "custom": "my custom" } 

{ "id": "my id", "custom": "{'x': 'y'}" } 

Wie Sie sehen können, ‚custom‘ Feld ein JSON sein kann, die nicht deserialisiert werden kann, weil Jackson es erwarten ein POJO anstelle eines String zu sein, habe ich versucht, diese JSON mit Zitaten Einwickeln aber sie werden ignoriert und das Feld wird als JSON behandelt.

Wie kann ich Jackson Bibliothek wissen, dass dieses Feld klar gehalten werden soll?

Ich hatte gelesen und die beste Lösung, die ich kam, ist eine benutzerdefinierte Deserializer schreiben, in diesem Fall habe ich keine Ahnung, wie man mit Finatra integrieren.

Antwort

0

Wie "Ryan O'Neill" in Finatra Google Group hingewiesen, gibt es Beispiele zum Schreiben eines benutzerdefinierten Deserializer in ExampleCaseClasses.scala.

Ich bin Kopieren Sie den folgenden Code aus früheren scala Quelle:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize 

case class CaseClassWithCustomDecimalFormat(
    @JsonDeserialize(using = classOf[MyBigDecimalDeserializer]) 
    myBigDecimal: BigDecimal, 
    @JsonDeserialize(using = classOf[MyBigDecimalDeserializer]) 
optMyBigDecimal: Option[BigDecimal]) 

class MyBigDecimalDeserializer extends JsonDeserializer[BigDecimal] { 
    override def deserialize(jp: JsonParser, ctxt: DeserializationContext): BigDecimal = { 
    val jsonNode: ValueNode = jp.getCodec.readTree(jp) 
    BigDecimal(jsonNode.asText).setScale(2, RoundingMode.HALF_UP) 
    } 

    override def getEmptyValue: BigDecimal = BigDecimal(0) 
} 

Dank Ryan.