Prevents NPE when deserializing objects with empty number values
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 09 May 2013 22:19:30 +0200
changeset 778f8308a9ed04
parent 76 b646af8e9c2a
child 78 48a3f8b90787
Prevents NPE when deserializing objects with empty number values
json-tck/src/main/java/net/java/html/json/tests/JSONTest.java
json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java
     1.1 --- a/json-tck/src/main/java/net/java/html/json/tests/JSONTest.java	Thu May 09 21:49:33 2013 +0200
     1.2 +++ b/json-tck/src/main/java/net/java/html/json/tests/JSONTest.java	Thu May 09 22:19:30 2013 +0200
     1.3 @@ -20,8 +20,10 @@
     1.4   */
     1.5  package net.java.html.json.tests;
     1.6  
     1.7 +import java.io.ByteArrayInputStream;
     1.8  import net.java.html.json.Context;
     1.9  import net.java.html.json.Model;
    1.10 +import net.java.html.json.Models;
    1.11  import net.java.html.json.OnReceive;
    1.12  import net.java.html.json.Property;
    1.13  import org.apidesign.bck2brwsr.vmtest.BrwsrTest;
    1.14 @@ -345,7 +347,24 @@
    1.15          assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName();
    1.16          assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex();
    1.17      }
    1.18 -
    1.19 +    
    1.20 +    @Model(className = "NameAndValue", properties = {
    1.21 +        @Property(name = "name", type = String.class),
    1.22 +        @Property(name = "value", type = long.class),
    1.23 +        @Property(name = "small", type = byte.class)
    1.24 +    })
    1.25 +    static class NandV {
    1.26 +    }
    1.27 +    
    1.28 +    @BrwsrTest public void parseNullNumber() throws Exception {
    1.29 +        String txt = "{ \"name\":\"M\" }";
    1.30 +        ByteArrayInputStream is = new ByteArrayInputStream(txt.getBytes("UTF-8"));
    1.31 +        NameAndValue v = Models.parse(Utils.newContext(), NameAndValue.class, is);
    1.32 +        assert "M".equals(v.getName()) : "Name is 'M': " + v.getName();
    1.33 +        assert 0 == v.getValue() : "Value is empty: " + v.getValue();
    1.34 +        assert 0 == v.getSmall() : "Small value is empty: " + v.getSmall();
    1.35 +    }
    1.36 +    
    1.37      static Object[] create() {
    1.38          return VMTest.create(JSONTest.class);
    1.39      }
     2.1 --- a/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Thu May 09 21:49:33 2013 +0200
     2.2 +++ b/json/src/main/java/org/apidesign/html/json/impl/ModelProcessor.java	Thu May 09 22:19:30 2013 +0200
     2.3 @@ -311,7 +311,8 @@
     2.4                              w.append(type).append(".valueOf((String)ret[" + cnt + "]);\n");
     2.5                          } else if (isPrimitive(type)) {
     2.6                              w.append("    this.prop_").append(pn);
     2.7 -                            w.append(" = ((Number)").append("ret[" + cnt + "]).");
     2.8 +                            w.append(" = ret[" + cnt + "] == null ? (").append(type).append(")0 : ");
     2.9 +                            w.append("((Number)").append("ret[" + cnt + "]).");
    2.10                              w.append(type).append("Value();\n");
    2.11                          } else {
    2.12                              w.append("    this.prop_").append(pn);