2017-12-07 2 views
0

Ich habe Probleme herauszufinden, wie meine a Doppel zu einem int in meinem POJO zu serialisieren. Im Moment mache ich schlampig die Konvertierung innerhalb der Setter-Methode. Die Doppel werden immer zwischen 0 und 1. Unterhalb die Getter und Setter-Methoden: In meinem POJO sind:Serialisierung von double zu einem int innerhalb von POJO

@JsonProperty("costMargin") 
public int getCostMargin() { 
    return costMargin; 
} 

@JsonProperty("costMargin") 
public void setCostMargin(double costMargin) { 
     this.costMargin = (int)(Math.round(costMargin * 100)); 
} 

Kann jemand mir helfen herauszufinden, wie diese doppelten, in einem int serialisiert, ohne die Umwandlung in den Setter zu machen Methode? Ich versuche, andere Möglichkeiten zu untersuchen, wie das Erstellen einer Serialisierungsklasse und das Einfügen einer Anmerkung in meinem Pojo. Beispiel: @JsonSerialize (using = CustomDoubleSerializer.class)

+1

Was bedeutet es, „zu einem Doppel eine Serialisierung int "? Was passiert, wenn der 'double' Wert für ein' int' zu groß ist? Sie müssen klären, was Sie erreichen möchten. Aus dem Code sieht es so aus, als ob Sie einen finanziellen Wert als skalierten Integer (d. H. Cent) speichern möchten. In diesem Fall funktioniert das, was Sie haben, solange Sie verstehen, wie das Runden einer Gleitkommazahl zu unerwarteten Ergebnissen führt. Sie sollten besser keinen Fließkommawert für Finanzdaten irgendwo in Ihrem Code verwenden, aber Sie haben diese Option möglicherweise nicht. –

+0

Entschuldigung für die fehlende Einbeziehung von Details. Das Doppelte wird immer zwischen 0 und 1 sein. Und ich versuche, keine Berechnung innerhalb meiner Setter- oder Getter-Methoden außer Setzen und Erhalten zu haben. –

Antwort

0

Antwort ist: Sie können es nicht tun.

Sie müssen double in int konvertieren, indem Sie sie irgendwie abschneiden oder abrunden.

In Ihrem Code verletzen Sie nur Java Bean-Spezifikation. Getter gibt int zurück, aber Setter hat double als Parameter.

Wenn ja, müssen Sie in Setter konvertieren. Andernfalls müssen Sie es im Anrufer tun, bevor Sie einen Setter anrufen.

+0

Ich versuche, andere Möglichkeiten zu suchen, wie das Erstellen einer Serialisierungsklasse und das Einfügen einer Anmerkung in meinem Pojo: @JsonSerialize (using = CustomDoubleSerializer.class) –

+0

Warum nicht? Trotzdem musst du Double nach eigenen Regeln konvertieren. (d. h. 'Math.round' Sie haben) und wenn Sie viele Felder haben, um dies zu tun - Custom Serializer macht Sinn. Um konsistent zu sein, warum sollte man keine Superklasse 'java.lang.Number' für Getter/Setter anstelle von' int' verwenden? – Vadim

0

ich landete mit:

@JsonSerialize(using = CustomDoubleSerializer.class) 
    @JsonProperty("costMargin") 
     public int getCostMargin() { 
     return costMargin; 
    } 

zu nennen

public class CustomDoubleSerializer extends JsonSerializer<Double> { 

@Override 
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) 
     throws IOException, JsonProcessingException { 
    gen.writeObject((int)(Math.round(value * 100))); 
} 

}

public class CustomDoubleSerializer JsonSerializer erstreckt {

Verwandte Themen