2014-03-13 5 views
5

Es gibt ein ‚Feature‘ von Jettison, im Jahr 2008 in einem JIRA entry Weg zurück skizziert, die auf das folgende Problem bezieht:Jettison/String als ganze Zahl zurückgegeben, wenn Rangier

Lassen Sie uns sagen, dass ich den Wert von „Element“ bitten, sei "00102"; die Ausgabe aussehen wie folgt:

{ "Response": 
    { "element": "00102" } 
} 

aber jetzt habe ich gesetzt „Element“ „102“ zu sein:

{ "Response": 
    { "element": 102 } 
} 

Ich verstehe Jettison hilfreich sein versucht ... aber ernsthaft, ich don Ich brauche es nicht, um so etwas in meinem Namen zu entscheiden. Nein danke.

Aktuelle Behelfslösung

Im Moment habe ich eine Lösung, die durch den Benutzer here, der die folgenden auf die Bohne Config fügt skizzierte verwendet:

<bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/> 

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider"> 
    <property name="typeConverter" ref="simpleConverter"/> 
</bean> 

Diese zum Teil löst die Problem, in dem Sinne, dass alle Elemente gezwungen werden, Strings zu sein, auch wenn sie eindeutig ganze Zahlen sind. Zumindest weiß ich jetzt genau, welche Struktur meine Daten haben werden, und der Elementtyp wird sich ohne mein Wissen nicht von einer Zeichenkette in eine ganze Zahl und wieder zurück ändern.

Problem

Allerdings bin ich nicht in der Lage ein weiteres Element, jetzt als eine ganze Zahl ausgeben, auch wenn ich jetzt so tun würde mich wünschen. Es scheint, als könnte ich die Ausgabe von Elementen nur dazu zwingen, über den gesamten Service zu stringeln, anstatt auf einer pro-Element-Basis.

Abgesehen von den 'using Jackson'-Vorschlägen (denen ich nicht folgen kann, da das Framework explizit Jettison verwendet) gibt es noch andere Möglichkeiten, welche Elemente ich als String in meiner JSON-Ausgabe erzwingen möchte ?

+0

„Rahmen explizit verwendet Jettison "<- welcher Rahmen? – fge

+0

Interner Unternehmensrahmen – Ron

Antwort

1

Die SimpleConverter konvertieren auch Double und Boolean in String, und das ist ein Problem.

Sie können den Standardkonverter nur für Ihre "speziellen" Nummern überschreiben. Leider gibt es keine Möglichkeit der Kontext der ursprünglichen Feld, um zu sehen zu konvertieren

public class MyConverter extends org.codehaus.jettison.mapped.DefaultConverter { 

    public Object convertToJSONPrimitive(String text) { 
     Object primitive = super.convertToJSONPrimitive(text); 

     //Apply your conversion rule; 
     if (primitive != null 
       && primitive instanceof Long 
       && text.startsWith("0")) 
      return text; 
     else 
      return primitive; 
    } 
} 

Sie können den vollständigen Code von DefaultConverter here

Und die CXF Konfiguration siehe

<bean id="myConverter" class="MyConverter"/> 

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider"> 
    <property name="typeConverter" ref="myConverter"/> 
</bean> 
Verwandte Themen