2016-06-10 9 views
0

Ich bin in der Lage, ein Anfrage-Bereich Attribut (ein JAX-RS ContainerRequestContext hinzufügen, weil ich lieber Jackson verwenden würde, um meine Parameter in Objekte als JAX zu konvertieren -RS ist schlecht konzipiert und klobig ParameterConverterProviders) zu einem DeserializationContext, so dass es innerhalb einer JsonDeserializer erhalten werden kann. Ich muss convertValue() statt einfach readValue() (nicht mit tatsächlichen JSON) anrufen, so dass ich nicht in der Lage bin, ein ObjectReader in jedem Thread zu erstellen, wenn ich bereit bin, meine Karte zu einem JSON-String zuerst zu serialisieren und dann wieder zurück - was wäre unglaublich ineffizient.Set Jackson DeserializationContext Attribut in pro-Anfrage, thread-sichere Weise

Ich möchte in der Lage sein, etwas zu tun, dass die folgend, aber in einer pro Anfrage Weise erreicht:

ObjectMapper om = new ObjectMapper(); 

//in request-scoped context: 
om.getDeserializationContext().setAttribute("requestContext",containerRequestContext) 
Map<String,Object> mapOfRequestParameters = ... 

BeanOfVastImportance bean = om.convertValue(mapOfRequestParameters,BeanOfVastImportance.class) 

Wie kann ich erreichen, dies ohne den massiven, überflüssigen Aufwand benötigen, um eine neue ObjectMapper zu erstellen für jedes einzelne Anfrage-Thread?

+0

konfigurieren Mapper ist nicht sicher. Kannst du einfach eine bestimmte Anzahl von Mappers auf allen möglichen Konfigurationen erstellen und nur nach dem suchen, was du brauchst? –

+0

Das ist technisch machbar, würde aber im Grunde die Bequemlichkeit von Jackson beseitigen. Ich muss nur in der Lage sein, convertValue auf einem unveränderlichen ObjectReader aufzurufen (wo es möglich ist, Kontextattribute zu setzen), aber das ist im Moment nicht möglich, also eine Suche oder eine Lösung, die es mir ermöglichen würde, dasselbe zu erreichen. – THX1138

Antwort

1

Dies kann leicht erreicht werden durch:..

objectMapper.reader() forType (Request.class) .withAttribute ("Schlüssel", "value") Readvalue ("Quelle")