繁体   English   中英

用户定义的类中的原始字段的Jersey-Jackson映射问题

[英]Jersey-Jackson mapping issue for primitive fields in a user-defined class

我在客户端使用AngularJS,在球衣端使用Java和jersey + jackson进行RESTful Web服务。

我正在使用HTTP PUT方法更新记录。 我正在从角度客户端应用程序向Java Web服务应用程序发送参数(JSON对象)。

我们的POJO类具有一些原始数字字段(long / int),默认值为0。 但是,在收到包含这些字段的空白字符串的JSON时, jersey-jackson会将这些数字字段的值映射为null,这不是我们想要的预期行为

在从客户端应用程序发送空值的情况下,如何配置Web服务应用程序以映射默认值(数字字段为0)?

java webservice项目中的样本POJO类:

@XmlRootElement
public class modelclass {
    private Long telephoneNumber = 0;
    private Long faxNumber = 0;
    private String name = "";
public modelclass (String jsonData) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            modelclass pdo = mapper.readValue(jsonData, modelclass.class);
            this.telephoneNumber = pdo.telephoneNumber;
            this.faxNumber = pdo.faxNumber;
            this.name = pdo.name;
        }
}
}

您有两种选择。 您没有提及正在使用的Jersey / Jackson版本,因此我将假定两者均使用2.x +。

使用现有代码,您可以在将值分配给字段之前检查null值。

您还可以使用Jackson注释重写POJO:

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ModelClass {
    private Long telephoneNumber = 0;
    private Long faxNumber = 0;
    private String name = "";
}

@JsonAutoDetect告诉Jackson甚至可以处理private字段,而@JsonIgnoreProperties使其忽略json输入字符串中的无关内容。 我没有测试过,但是它应该做您想要的。

附带说明一下,您使用Long存储电话号码的任何特殊原因是什么? 我总是将它们存储为String或某种URI。 我发现它使显示/格式化更加容易。

作为一种选择,您可以在构造函数中添加对输入值的验证,或者注册一个自定义的Long 反序列化程序 ,该程序为null字段设置默认值。

这是一个例子:

public class JacksonDefaultValues {
    public static class Model {
        private final long  telephoneNumber;
        private final long faxNumber;
        private final String name;

        @JsonCreator
        public Model(@JsonProperty("telephoneNumber") Long telephoneNumber,
                     @JsonProperty("faxNumber") Long faxNumber,
                     @JsonProperty("name") String name) {
            // add validation as follows:
            // this.telephoneNumber = telephoneNumber == null ? 1234567l : telephoneNumber;
            this.telephoneNumber = telephoneNumber;
            this.faxNumber = faxNumber;
            this.name = name;
        }

        @Override
        public String toString() {
            return "Model{" +
                    "telephoneNumber=" + telephoneNumber +
                    ", faxNumber=" + faxNumber +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    private static class LongDeserializerDefaultValue extends StdDeserializer<Long> {
        private final long defaultValue;

        protected LongDeserializerDefaultValue(long defaultValue) {
            super(Long.TYPE);
            this.defaultValue = defaultValue;
        }

        @Override
        public Long getNullValue() {
            return defaultValue;
        }

        @Override
        public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
            return _parseLong(jp, ctxt);
        }
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule testModule = new SimpleModule()
                .addDeserializer(Long.class, new LongDeserializerDefaultValue(678));
        mapper.registerModule(testModule);
        String json = "{\"telephoneNumber\":0,\"name\":\"John\"}";
        System.out.println(mapper.readValue(json, Model.class));
    }

}

输出:

Model{telephoneNumber=0, faxNumber=678, name='John'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM