2017-02-13 75 views
0

什麼是DeserializationFeature.ACCEPT_FLOAT_AS_INT在交替傑克遜數據綁定2.5,因爲這反序列化配置不2.5可用(其可用自2.6傑克遜-2.5數據綁定轉換浮動到int

我們的應用程序使用jackson-databind 2.5,其中我們注意到float正在轉換爲int。

雖然我們需要禁用價值轉換,強制。但是,正如我們所使用傑克遜2.5,有NODeserializationFeature.ACCEPT_FLOAT_AS_INT

如何禁用2.5本浮動轉變爲int的轉換?如果他在「age」中提供float,而不是int,我們期望用戶應該得到數據驗證異常。

下面是示例POJO

public class User { 

    private String name; 
    private Integer age; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 

} 

這是測試代碼(使用傑克遜 - 數據綁定2.5):的上述測試代碼

import com.fasterxml.jackson.core.JsonParseException; 
import com.fasterxml.jackson.databind.JsonMappingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class TestConvert { 

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 

     ObjectMapper mapper = new ObjectMapper(); 
     String json = "{\"name\" : \"foobar\", \"age\" : 2.99}"; 

     //JSON from file to Object 
     User user = mapper.readValue(json, User.class); 

     //Object to JSON in String 
     String jsonInString = mapper.writeValueAsString(user); 
     System.out.println(jsonInString); 


    } 

} 

輸出是:

{「名「:」foobar「,」age「:2}

+0

可能的重複[Java傑克遜 - 防止浮動到int轉換時反序列化](http://stackoverflow.com/questions/25076030/java-jackson-pre當反序列化時通氣浮動到整型轉換) –

回答

0

更改您的用戶類是這樣的:

package ch.hasselba.jackson.test2; 

import com.fasterxml.jackson.databind.JsonMappingException; 

public class User { 

    private String name; 
    private int age; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(Object age) throws JsonMappingException { 

     if(age instanceof Float) 
      throw new com.fasterxml.jackson.databind.JsonMappingException("Bad Age! No Floats allowed!"); 
     if(age instanceof Double) 
      throw new com.fasterxml.jackson.databind.JsonMappingException("Bad Age! No Doubles please!"); 

     this.age = (Integer) age; 
    } 

} 

,您會收到類似這樣的錯誤:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Bad Value! No Doubles please 
at [Source: {"name" : "foobar", "age" : 2.99}; line: 1, column: 29] (through reference chain: ch.hasselba.jackson.test2.User["age"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:268) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:537) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty._throwAsIOE(SettableBeanProperty.java:518) 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833) 
    at ch.hasselba.jackson.test2.TestConvert.main(TestConvert.java:19) 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Bad Value! No Doubles please 
    at ch.hasselba.jackson.test2.User.setAge(User.java:24) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:97) 
    ... 5 more 

與傑克遜2.8.0和殘疾人DeserializationFeature.ACCEPT_FLOAT_AS_INT錯誤看起來是這樣的:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not coerce a floating-point value ('2.99') into Integer; enable `DeserializationFeature.ACCEPT_FLOAT_AS_INT` to allow 
at [Source: {"name" : "foobar", "age" : 2.99}; line: 1, column: 29] (through reference chain: ch.hasselba.jackson.test2.User["age"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261) 
    at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1233) 
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._failDoubleToIntCoercion(StdDeserializer.java:1118) 
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:430) 
    at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:308) 
    at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$IntegerDeserializer.deserialize(NumberDeserializers.java:286) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:490) 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833) 
    at ch.hasselba.jackson.test2.TestConvert.main(TestConvert.java:19) 
+0

謝謝....它以這種方式工作。但我希望全局處理它,並且不要在每個POJO(使用原始int的地方)中使用自定義代碼。在2.5中有沒有一些針對傑克遜的配置來處理這個問題? – sanjay

相關問題