This is an automated email from the ASF dual-hosted git repository.
hzlu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git
The following commit(s) were added to refs/heads/master by this push:
new bdf4dbd Compatible support for ZNRecord to work with Jackson 1 mapper
(#1659)
bdf4dbd is described below
commit bdf4dbd01a42570f267d8d604a4e192755af18d4
Author: Huizhi Lu <[email protected]>
AuthorDate: Tue Mar 2 15:02:29 2021 -0800
Compatible support for ZNRecord to work with Jackson 1 mapper (#1659)
Jackson was upgraded in helix from 1.x to 2.x (#1293). Jackson 1.x does not
support Jackson 2.x annotations.
This commit rolls back Jackson 2 annotations to Jackson 1, and adds a
custom CodehausJacksonAnnotationIntrospector to make Jackson 2 in helix work
with Jackson 1 annotations.
---
.../src/main/java/org/apache/helix/ZNRecord.java | 14 +-
.../apache/helix/store/PropertyJsonSerializer.java | 22 +-
.../org/apache/helix/TestShuffledIdealState.java | 6 +-
.../helix/manager/zk/TestZNRecordSerializer.java | 122 +++++++--
helix-rest/pom.xml | 5 -
.../rest/server/resources/AbstractResource.java | 9 +
.../resources/helix/AbstractHelixResource.java | 2 +-
.../server/resources/helix/ResourceAccessor.java | 2 +-
.../helix/rest/server/AbstractTestClass.java | 7 +-
.../helix/rest/server/TestClusterAccessor.java | 18 +-
.../rest/server/TestPropertyStoreAccessor.java | 2 +-
...adata-store-directory-common-1.0.2-SNAPSHOT.ivy | 2 +-
metadata-store-directory-common/pom.xml | 2 +-
zookeeper-api/pom.xml | 10 +-
.../zookeeper/datamodel/SessionAwareZNRecord.java | 2 +-
.../apache/helix/zookeeper/datamodel/ZNRecord.java | 14 +-
.../serializer/ZNRecordJacksonSerializer.java | 5 +-
.../datamodel/serializer/ZNRecordSerializer.java | 9 +-
.../serializer/ZNRecordStreamingSerializer.java | 2 +-
.../introspect/CodehausJacksonIntrospector.java | 278 +++++++++++++++++++++
.../TestZNRecordSerializeWriteSizeLimit.java | 2 +
zookeeper-api/zookeeper-api-1.0.2-SNAPSHOT.ivy | 1 +
22 files changed, 458 insertions(+), 78 deletions(-)
diff --git a/helix-common/src/main/java/org/apache/helix/ZNRecord.java
b/helix-common/src/main/java/org/apache/helix/ZNRecord.java
index bfbe15f..7ace8c1 100644
--- a/helix-common/src/main/java/org/apache/helix/ZNRecord.java
+++ b/helix-common/src/main/java/org/apache/helix/ZNRecord.java
@@ -19,20 +19,20 @@ package org.apache.helix;
* under the License.
*/
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion;
-
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
/**
- * Deprecated; please use ZNRecord in zookeeper-api instead.
- *
+ * @deprecated
+ * Please use {@link org.apache.helix.zookeeper.datamodel.ZNRecord}
+ * in zookeeper-api instead.
+ * <p>
* Generic Record Format to store data at a Node This can be used to store
* simpleFields mapFields listFields
*/
@Deprecated
@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = Inclusion.NON_NULL)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ZNRecord extends org.apache.helix.zookeeper.datamodel.ZNRecord {
public ZNRecord(String id) {
super(id);
diff --git
a/helix-core/src/main/java/org/apache/helix/store/PropertyJsonSerializer.java
b/helix-core/src/main/java/org/apache/helix/store/PropertyJsonSerializer.java
index ea04181..ceedc2c 100644
---
a/helix-core/src/main/java/org/apache/helix/store/PropertyJsonSerializer.java
+++
b/helix-core/src/main/java/org/apache/helix/store/PropertyJsonSerializer.java
@@ -22,12 +22,11 @@ package org.apache.helix.store;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.DeserializationFeature;
import org.apache.helix.HelixException;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,10 +41,10 @@ public class PropertyJsonSerializer<T> implements
PropertySerializer<T> {
@Override
public byte[] serialize(T data) throws PropertyStoreException {
-
- mapper.enable(SerializationFeature.INDENT_OUTPUT);
- mapper.enable(MapperFeature.AUTO_DETECT_FIELDS);
- mapper.enable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS);
+ SerializationConfig serializationConfig = mapper.getSerializationConfig();
+ serializationConfig.set(SerializationConfig.Feature.INDENT_OUTPUT, true);
+ serializationConfig.set(SerializationConfig.Feature.AUTO_DETECT_FIELDS,
true);
+
serializationConfig.set(SerializationConfig.Feature.CAN_OVERRIDE_ACCESS_MODIFIERS,
true);
StringWriter sw = new StringWriter();
try {
@@ -68,9 +67,10 @@ public class PropertyJsonSerializer<T> implements
PropertySerializer<T> {
public T deserialize(byte[] bytes) throws PropertyStoreException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
- mapper.enable(MapperFeature.AUTO_DETECT_FIELDS);
- mapper.enable(MapperFeature.AUTO_DETECT_SETTERS);
- mapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+ DeserializationConfig deserializationConfig =
mapper.getDeserializationConfig();
+
deserializationConfig.set(DeserializationConfig.Feature.AUTO_DETECT_FIELDS,
true);
+
deserializationConfig.set(DeserializationConfig.Feature.AUTO_DETECT_SETTERS,
true);
+
deserializationConfig.set(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
true);
try {
T value = mapper.readValue(bais, _clazz);
return value;
diff --git
a/helix-core/src/test/java/org/apache/helix/TestShuffledIdealState.java
b/helix-core/src/test/java/org/apache/helix/TestShuffledIdealState.java
index 8c55644..6b8a69c 100644
--- a/helix-core/src/test/java/org/apache/helix/TestShuffledIdealState.java
+++ b/helix-core/src/test/java/org/apache/helix/TestShuffledIdealState.java
@@ -31,10 +31,11 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.helix.tools.IdealCalculatorByConsistentHashing;
import org.apache.helix.tools.IdealStateCalculatorByRush;
import org.apache.helix.tools.IdealStateCalculatorByShuffling;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.introspect.CodehausJacksonIntrospector;
import org.testng.Assert;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
public class TestShuffledIdealState {
@@ -65,7 +66,8 @@ public class TestShuffledIdealState {
IdealCalculatorByConsistentHashing.printNodeOfflineOverhead(result3);
// System.out.println(result);
- ObjectMapper mapper = new ObjectMapper();
+ ObjectMapper mapper =
+ new ObjectMapper().setAnnotationIntrospector(new
CodehausJacksonIntrospector());
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
StringWriter sw = new StringWriter();
diff --git
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestZNRecordSerializer.java
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestZNRecordSerializer.java
index f5d14a3..74a369e 100644
---
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestZNRecordSerializer.java
+++
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestZNRecordSerializer.java
@@ -1,24 +1,5 @@
package org.apache.helix.manager.zk;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
-import org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -38,6 +19,32 @@ import org.testng.annotations.Test;
* under the License.
*/
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
public class TestZNRecordSerializer {
/**
* Test the normal case of serialize/deserialize where ZNRecord is
well-formed
@@ -271,4 +278,81 @@ public class TestZNRecordSerializer {
runId = runId + 1;
}
}
+
+ /*
+ * Tests Jackson 1.x can work with ZNRecord
+ */
+ @Test
+ public void testCodehausJacksonSerializer() {
+ ZNRecord record = createZnRecord();
+
+ ZNRecordSerializer znRecordSerializer = new ZNRecordSerializer();
+ CodehausJsonSerializer<ZNRecord> codehausJsonSerializer =
+ new CodehausJsonSerializer<>(ZNRecord.class);
+
+ byte[] codehausBytes = codehausJsonSerializer.serialize(record);
+
+ ZNRecord deserialized =
+ (ZNRecord) codehausJsonSerializer.deserialize(codehausBytes);
+ Assert.assertEquals(deserialized, record,
+ "Codehaus jackson serializer should work with ZNRecord");
+
+ deserialized = (ZNRecord) znRecordSerializer.deserialize(codehausBytes);
+ Assert.assertEquals(deserialized, record,
+ "ZNRecordSerializer should deserialize bytes serialized by codehaus
serializer");
+
+ deserialized =
+ (ZNRecord)
codehausJsonSerializer.deserialize(znRecordSerializer.serialize(record));
+ Assert.assertEquals(deserialized, record,
+ "codehaus serializer should deserialize bytes serialized by
ZNRecordSerializer");
+ }
+
+ private static class CodehausJsonSerializer<T> {
+ private static final Logger LOG =
LoggerFactory.getLogger(CodehausJsonSerializer.class);
+
+ private final Class<T> _clazz;
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ public CodehausJsonSerializer(Class<T> clazz) {
+ _clazz = clazz;
+ }
+
+ public byte[] serialize(Object data) {
+ SerializationConfig serializationConfig =
mapper.getSerializationConfig();
+ serializationConfig.set(SerializationConfig.Feature.INDENT_OUTPUT, true);
+ serializationConfig.set(SerializationConfig.Feature.AUTO_DETECT_FIELDS,
true);
+
serializationConfig.set(SerializationConfig.Feature.CAN_OVERRIDE_ACCESS_MODIFIERS,
true);
+ StringWriter sw = new StringWriter();
+
+ try {
+ mapper.writeValue(sw, data);
+ return sw.toString().getBytes();
+ } catch (Exception e) {
+ LOG.error("Error during serialization of data", e);
+ }
+
+ return new byte[]{};
+ }
+
+ public Object deserialize(byte[] bytes) {
+ if (bytes == null || bytes.length == 0) {
+ return null;
+ }
+
+ try {
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+
+ DeserializationConfig deserializationConfig =
mapper.getDeserializationConfig();
+
deserializationConfig.set(DeserializationConfig.Feature.AUTO_DETECT_FIELDS,
true);
+
deserializationConfig.set(DeserializationConfig.Feature.AUTO_DETECT_SETTERS,
true);
+
deserializationConfig.set(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
true);
+
+ return mapper.readValue(bais, _clazz);
+ } catch (Exception e) {
+ LOG.error("Error during deserialization of bytes: " + new
String(bytes), e);
+ }
+
+ return null;
+ }
+ }
}
diff --git a/helix-rest/pom.xml b/helix-rest/pom.xml
index c910fbd..e8f778e 100644
--- a/helix-rest/pom.xml
+++ b/helix-rest/pom.xml
@@ -124,11 +124,6 @@
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.11.0</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0</version>
</dependency>
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
index ac90227..f95f20e 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/AbstractResource.java
@@ -32,11 +32,14 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.helix.HelixException;
import org.apache.helix.rest.common.ContextPropertyKeys;
import org.apache.helix.rest.common.HelixRestNamespace;
import org.apache.helix.rest.server.auditlog.AuditLog;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.introspect.CodehausJacksonIntrospector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -159,6 +162,12 @@ public class AbstractResource {
protected static ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+ // Needs a separate object reader for ZNRecord annotated with Jackson 1
+ // TODO: remove AnnotationIntrospector config once ZNRecord upgrades Jackson
+ protected static ObjectReader ZNRECORD_READER = new ObjectMapper()
+ .setAnnotationIntrospector(new CodehausJacksonIntrospector())
+ .readerFor(ZNRecord.class);
+
protected static String toJson(Object object)
throws IOException {
OBJECT_MAPPER.enable(SerializationFeature.INDENT_OUTPUT);
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/AbstractHelixResource.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/AbstractHelixResource.java
index 200be80..5bd8f13 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/AbstractHelixResource.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/AbstractHelixResource.java
@@ -83,7 +83,7 @@ public class AbstractHelixResource extends AbstractResource {
protected static ZNRecord toZNRecord(String data)
throws IOException {
- return OBJECT_MAPPER.reader(ZNRecord.class).readValue(data);
+ return ZNRECORD_READER.readValue(data);
}
private ServerContext getServerContext() {
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAccessor.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAccessor.java
index 56c621a..8c93c79 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAccessor.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/resources/helix/ResourceAccessor.java
@@ -279,7 +279,7 @@ public class ResourceAccessor extends AbstractHelixResource
{
TypeReference<Map<String, ZNRecord>> typeRef =
new TypeReference<Map<String, ZNRecord>>() {
};
- input = OBJECT_MAPPER.readValue(content, typeRef);
+ input = ZNRECORD_READER.forType(typeRef).readValue(content);
} catch (IOException e) {
_logger.error("Failed to deserialize user's input {}, Exception:
{}", content, e);
return badRequest("Input is not a valid map of String-ZNRecord
pairs!");
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/AbstractTestClass.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/AbstractTestClass.java
index e937402..a64b37c 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/AbstractTestClass.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/AbstractTestClass.java
@@ -37,6 +37,7 @@ import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
import com.google.common.base.Joiner;
import org.apache.helix.AccessOption;
import org.apache.helix.BaseDataAccessor;
@@ -78,6 +79,7 @@ import org.apache.helix.util.ZKClientPool;
import org.apache.helix.zookeeper.api.client.HelixZkClient;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.zookeeper.impl.factory.DedicatedZkClientFactory;
+import org.apache.helix.zookeeper.introspect.CodehausJacksonIntrospector;
import org.apache.helix.zookeeper.zkclient.ZkServer;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.server.ResourceConfig;
@@ -115,6 +117,9 @@ public class AbstractTestClass extends
JerseyTestNg.ContainerPerClassTest {
protected static ConfigAccessor _configAccessor;
protected static BaseDataAccessor<ZNRecord> _baseAccessor;
protected static ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+ protected static ObjectReader ZNRECORD_READER = new ObjectMapper()
+ .setAnnotationIntrospector(new CodehausJacksonIntrospector())
+ .readerFor(ZNRecord.class);
protected static boolean _init = false;
// For testing namespaced access
@@ -475,7 +480,7 @@ public class AbstractTestClass extends
JerseyTestNg.ContainerPerClassTest {
protected static ZNRecord toZNRecord(String data)
throws IOException {
- return OBJECT_MAPPER.reader(ZNRecord.class).readValue(data);
+ return ZNRECORD_READER.readValue(data);
}
protected String get(String uri, Map<String, String> queryParams, int
expectedReturnStatus,
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
index d88c4af..2e1561f 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestClusterAccessor.java
@@ -584,11 +584,11 @@ public class TestClusterAccessor extends
AbstractTestClass {
String oneModelUri = urlBase + oneModel;
String oneResult = get(oneModelUri, null,
Response.Status.OK.getStatusCode(), true);
- ZNRecord oneRecord = OBJECT_MAPPER.readValue(oneResult, ZNRecord.class);
+ ZNRecord oneRecord = toZNRecord(oneResult);
String twoResult =
get("clusters/" + cluster + "/statemodeldefs/" + twoModel, null,
Response.Status.OK.getStatusCode(), true);
- ZNRecord twoRecord = OBJECT_MAPPER.readValue(twoResult, ZNRecord.class);
+ ZNRecord twoRecord = toZNRecord(twoResult);
// delete one, expect success
String deleteOneUri = urlBase + oneRecord.getId();
@@ -619,7 +619,7 @@ public class TestClusterAccessor extends AbstractTestClass {
Assert.assertTrue(setOneRsp.getStatus() ==
Response.Status.OK.getStatusCode());
String oneResult2 = get(oneModelUri, null,
Response.Status.OK.getStatusCode(), true);
- ZNRecord oneRecord2 = OBJECT_MAPPER.readValue(oneResult2, ZNRecord.class);
+ ZNRecord oneRecord2 = toZNRecord(oneResult2);
Assert.assertEquals(oneRecord2, newRecord);
// set the delete one with original; namely restore the original condition
@@ -628,7 +628,7 @@ public class TestClusterAccessor extends AbstractTestClass {
Assert.assertTrue(setOneRsp2.getStatus() ==
Response.Status.OK.getStatusCode());
String oneResult3 = get(oneModelUri, null,
Response.Status.OK.getStatusCode(), true);
- ZNRecord oneRecord3 = OBJECT_MAPPER.readValue(oneResult3, ZNRecord.class);
+ ZNRecord oneRecord3 = toZNRecord(oneResult3);
Assert.assertEquals(oneRecord3, oneRecord);
System.out.println("End test :" + TestHelper.getTestMethodName());
}
@@ -994,7 +994,7 @@ public class TestClusterAccessor extends AbstractTestClass {
// Now test the getCloudConfig method.
String body = get(urlBase, null, Response.Status.OK.getStatusCode(), true);
- ZNRecord recordFromRest = new
ObjectMapper().reader(ZNRecord.class).readValue(body);
+ ZNRecord recordFromRest = toZNRecord(body);
CloudConfig cloudConfigRest = new
CloudConfig.Builder(recordFromRest).build();
CloudConfig cloudConfigZk = _configAccessor.getCloudConfig("TestCloud");
@@ -1112,7 +1112,7 @@ public class TestClusterAccessor extends
AbstractTestClass {
// Now get the Cloud Config and make sure the information is correct
String body = get(urlBase, null, Response.Status.OK.getStatusCode(), true);
- ZNRecord recordFromRest = new
ObjectMapper().reader(ZNRecord.class).readValue(body);
+ ZNRecord recordFromRest = toZNRecord(body);
CloudConfig cloudConfigRest = new
CloudConfig.Builder(recordFromRest).build();
Assert.assertTrue(cloudConfigRest.isCloudEnabled());
Assert.assertEquals(cloudConfigRest.getCloudID(), "TestCloudID");
@@ -1139,7 +1139,7 @@ public class TestClusterAccessor extends
AbstractTestClass {
// Now get the Cloud Config and make sure the information has been updated
body = get(urlBase, null, Response.Status.OK.getStatusCode(), true);
- recordFromRest = new ObjectMapper().reader(ZNRecord.class).readValue(body);
+ recordFromRest = toZNRecord(body);
cloudConfigRest = new CloudConfig.Builder(recordFromRest).build();
Assert.assertTrue(cloudConfigRest.isCloudEnabled());
Assert.assertEquals(cloudConfigRest.getCloudID(), "TestCloudIdNew");
@@ -1198,7 +1198,7 @@ public class TestClusterAccessor extends
AbstractTestClass {
// Now test the getCustomizedStateConfig method.
String body = get(urlBase, null, Response.Status.OK.getStatusCode(), true);
- ZNRecord recordFromRest = new
ObjectMapper().reader(ZNRecord.class).readValue(body);
+ ZNRecord recordFromRest = toZNRecord(body);
CustomizedStateConfig customizedConfigRest = new
CustomizedStateConfig.Builder(recordFromRest).build();
CustomizedStateConfig customizedConfigZk =
_configAccessor.getCustomizedStateConfig("TestClusterCustomized");
@@ -1298,7 +1298,7 @@ public class TestClusterAccessor extends
AbstractTestClass {
private ClusterConfig getClusterConfigFromRest(String cluster) throws
IOException {
String body = get("clusters/" + cluster + "/configs", null,
Response.Status.OK.getStatusCode(), true);
- ZNRecord record = new
ObjectMapper().reader(ZNRecord.class).readValue(body);
+ ZNRecord record = toZNRecord(body);
ClusterConfig clusterConfigRest = new ClusterConfig(record);
ClusterConfig clusterConfigZk = _configAccessor.getClusterConfig(cluster);
Assert.assertEquals(clusterConfigZk, clusterConfigRest, "cluster config
from response: "
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestPropertyStoreAccessor.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestPropertyStoreAccessor.java
index 51ea153..d891989 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/TestPropertyStoreAccessor.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/TestPropertyStoreAccessor.java
@@ -85,7 +85,7 @@ public class TestPropertyStoreAccessor extends
AbstractTestClass {
String data =
new
JerseyUriRequestBuilder("clusters/{}/propertyStore/ZnRecord").format(TEST_CLUSTER)
.isBodyReturnExpected(true).get(this);
- ZNRecord record = OBJECT_MAPPER.reader(ZNRecord.class).readValue(data);
+ ZNRecord record = toZNRecord(data);
Assert.assertEquals(record.getId(), TEST_ZNRECORD.getId());
}
diff --git
a/metadata-store-directory-common/metadata-store-directory-common-1.0.2-SNAPSHOT.ivy
b/metadata-store-directory-common/metadata-store-directory-common-1.0.2-SNAPSHOT.ivy
index 5493bd0..fd8f16f 100644
---
a/metadata-store-directory-common/metadata-store-directory-common-1.0.2-SNAPSHOT.ivy
+++
b/metadata-store-directory-common/metadata-store-directory-common-1.0.2-SNAPSHOT.ivy
@@ -47,7 +47,7 @@ under the License.
<artifact name="snakeyaml" m:classifier="sources" ext="jar"/>
</dependency>
<dependency org="org.apache.helix" name="helix-core"
rev="1.0.2-SNAPSHOT" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
- <dependency org="com.fasterxml.jackson.core"
name="jackson-databind" rev="2.10.2" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
+ <dependency org="com.fasterxml.jackson.core"
name="jackson-databind" rev="2.11.0" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="commons-cli" name="commons-cli" rev="1.2"
force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="commons-io" name="commons-io" rev="1.4"
conf="compile->compile(default);runtime->runtime(default);default->default"/>
</dependencies>
diff --git a/metadata-store-directory-common/pom.xml
b/metadata-store-directory-common/pom.xml
index ccc31c8..7db88b3 100644
--- a/metadata-store-directory-common/pom.xml
+++ b/metadata-store-directory-common/pom.xml
@@ -47,7 +47,7 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
- <version>2.10.2</version>
+ <version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
diff --git a/zookeeper-api/pom.xml b/zookeeper-api/pom.xml
index 5ee5296..aa8ef00 100644
--- a/zookeeper-api/pom.xml
+++ b/zookeeper-api/pom.xml
@@ -74,11 +74,6 @@
<version>2.11.0</version>
</dependency>
<dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.11.0</version>
- </dependency>
- <dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
@@ -114,6 +109,11 @@
<artifactId>mockito-all</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>1.9.13</version>
+ </dependency>
</dependencies>
<build>
<resources>
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/SessionAwareZNRecord.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/SessionAwareZNRecord.java
index e79c319..21b7f61 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/SessionAwareZNRecord.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/SessionAwareZNRecord.java
@@ -19,7 +19,7 @@ package org.apache.helix.zookeeper.datamodel;
* under the License.
*/
-import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnore;
/**
* A class represents a session aware ZNRecord: the ZNRecord should be written
to zk by
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/ZNRecord.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/ZNRecord.java
index bbfca86..5166f89 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/ZNRecord.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/ZNRecord.java
@@ -24,25 +24,23 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion;
import org.apache.helix.zookeeper.constant.ZkSystemPropertyKeys;
import
org.apache.helix.zookeeper.datamodel.serializer.JacksonPayloadSerializer;
import org.apache.helix.zookeeper.datamodel.serializer.PayloadSerializer;
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
/**
* Generic Record Format to store data at a Node This can be used to store
* simpleFields mapFields listFields
*/
@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = Inclusion.NON_NULL)
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ZNRecord {
static Logger _logger = LoggerFactory.getLogger(ZNRecord.class);
private final String id;
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordJacksonSerializer.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordJacksonSerializer.java
index ea122b2..0cbf8fe 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordJacksonSerializer.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordJacksonSerializer.java
@@ -23,6 +23,7 @@ import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.introspect.CodehausJacksonIntrospector;
import org.apache.helix.zookeeper.zkclient.exception.ZkMarshallingError;
import org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
@@ -32,7 +33,9 @@ import
org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
* this serializer doesn't check for the size of the resulting binary.
*/
public class ZNRecordJacksonSerializer implements ZkSerializer {
- private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
+ // TODO: remove it after upgrading ZNRecord's annotations to Jackson 2
+ .setAnnotationIntrospector(new CodehausJacksonIntrospector());
@Override
public byte[] serialize(Object record) throws ZkMarshallingError {
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordSerializer.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordSerializer.java
index 5cae87a..5838cfa 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordSerializer.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordSerializer.java
@@ -29,6 +29,7 @@ import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.introspect.CodehausJacksonIntrospector;
import org.apache.helix.zookeeper.util.GZipCompressionUtil;
import org.apache.helix.zookeeper.util.ZNRecordUtil;
import org.apache.helix.zookeeper.zkclient.exception.ZkMarshallingError;
@@ -36,10 +37,12 @@ import
org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
public class ZNRecordSerializer implements ZkSerializer {
- private static Logger LOG =
LoggerFactory.getLogger(ZNRecordSerializer.class);
- private static ObjectMapper mapper = new ObjectMapper();
+ private static final Logger LOG =
LoggerFactory.getLogger(ZNRecordSerializer.class);
+
+ private static ObjectMapper mapper = new ObjectMapper()
+ // TODO: remove it after upgrading ZNRecord's annotations to Jackson 2
+ .setAnnotationIntrospector(new CodehausJacksonIntrospector());
private static int getListFieldBound(ZNRecord record) {
int max = Integer.MAX_VALUE;
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordStreamingSerializer.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordStreamingSerializer.java
index ea1eb5f..41033e5 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordStreamingSerializer.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/datamodel/serializer/ZNRecordStreamingSerializer.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
public class ZNRecordStreamingSerializer implements ZkSerializer {
- private static Logger LOG =
LoggerFactory.getLogger(ZNRecordStreamingSerializer.class);
+ private static final Logger LOG =
LoggerFactory.getLogger(ZNRecordStreamingSerializer.class);
private static int getListFieldBound(ZNRecord record) {
int max = Integer.MAX_VALUE;
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/introspect/CodehausJacksonIntrospector.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/introspect/CodehausJacksonIntrospector.java
new file mode 100644
index 0000000..11034f6
--- /dev/null
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/introspect/CodehausJacksonIntrospector.java
@@ -0,0 +1,278 @@
+package org.apache.helix.zookeeper.introspect;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties.Value;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.PropertyName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize.Typing;
+import com.fasterxml.jackson.databind.introspect.Annotated;
+import com.fasterxml.jackson.databind.introspect.AnnotatedField;
+import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
+import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
+import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
+import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector;
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.codehaus.jackson.map.annotate.NoClass;
+
+/**
+ * This introspector works with jackson 1 annotations used in
+ * {@link org.apache.helix.zookeeper.datamodel.ZNRecord}.
+ * This is supposed used ONLY in Helix as it could be deprecated in the next
major release.
+ */
+// TODO: remove this class once upgrading to Jackson 2.x in ZNRecord
+public class CodehausJacksonIntrospector extends NopAnnotationIntrospector {
+ private static final long serialVersionUID = 1L;
+
+ public Value findPropertyIgnorals(Annotated a) {
+ JsonIgnoreProperties ignoreAnnotation =
a.getAnnotation(JsonIgnoreProperties.class);
+ if (ignoreAnnotation != null) {
+ return Value.forIgnoreUnknown(ignoreAnnotation.ignoreUnknown());
+ }
+ return super.findPropertyIgnorals(a);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public Class<?> findDeserializationContentType(Annotated a, JavaType
baseContentType) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<?> serClass = serializeAnnotation.contentAs();
+ if (serClass != NoClass.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public PropertyName findNameForDeserialization(Annotated a) {
+ String name = null;
+ if (a instanceof AnnotatedField) {
+ name = findDeserializationName((AnnotatedField) a);
+ } else if (a instanceof AnnotatedMethod) {
+ name = findDeserializationName((AnnotatedMethod) a);
+ } else if (a instanceof AnnotatedParameter) {
+ name = findDeserializationName((AnnotatedParameter) a);
+ }
+ if (name == null) {
+ return null;
+ }
+ return name.isEmpty() ? PropertyName.USE_DEFAULT : new PropertyName(name);
+ }
+
+ public String findDeserializationName(AnnotatedField af) {
+ JsonProperty propertyAnnotation = af.getAnnotation(JsonProperty.class);
+ return propertyAnnotation == null ? null : propertyAnnotation.value();
+ }
+
+ public String findDeserializationName(AnnotatedMethod am) {
+ JsonProperty propertyAnnotation = am.getAnnotation(JsonProperty.class);
+ return propertyAnnotation == null ? null : propertyAnnotation.value();
+ }
+
+ public String findDeserializationName(AnnotatedParameter param) {
+ if (param != null) {
+ JsonProperty propertyAnnotation =
param.getAnnotation(JsonProperty.class);
+ if (propertyAnnotation != null) {
+ return propertyAnnotation.value();
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public Class<?> findSerializationContentType(Annotated a, JavaType baseType)
{
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<?> serClass = serializeAnnotation.contentAs();
+ if (serClass != NoClass.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+
+ /*
+ * Handles JsonSerialize.Inclusion
+ */
+ @Override
+ public JsonInclude.Value findPropertyInclusion(Annotated a) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ for (Include include : Include.values()) {
+ if (include.name().equals(serializeAnnotation.include().name())) {
+ return JsonInclude.Value.construct(include, include);
+ }
+ }
+ }
+ return JsonInclude.Value.empty();
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public Include findSerializationInclusion(Annotated a, Include defValue) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ return serializeAnnotation == null ? defValue
+ : Include.valueOf(serializeAnnotation.include().name());
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public Include findSerializationInclusionForContent(Annotated a,
JsonInclude.Include defValue) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ return serializeAnnotation == null ? defValue
+ : Include.valueOf(serializeAnnotation.include().name());
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public Class<?> findSerializationKeyType(Annotated a, JavaType baseType) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<?> serClass = serializeAnnotation.keyAs();
+ if (serClass != NoClass.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public Class<?> findSerializationType(Annotated a) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<?> serClass = serializeAnnotation.as();
+ if (serClass != NoClass.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Typing findSerializationTyping(Annotated a) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ return serializeAnnotation == null ? null :
Typing.valueOf(serializeAnnotation.typing().name());
+ }
+
+ @Override
+ public PropertyName findNameForSerialization(Annotated a) {
+ String name;
+ if (a instanceof AnnotatedField) {
+ name = findSerializationName((AnnotatedField) a);
+ } else if (a instanceof AnnotatedMethod) {
+ name = findSerializationName((AnnotatedMethod) a);
+ } else {
+ name = null;
+ }
+ if (name != null) {
+ if (name.length() == 0) { // empty String means 'default'
+ return PropertyName.USE_DEFAULT;
+ }
+ return new PropertyName(name);
+ }
+ return null;
+ }
+
+ public String findSerializationName(AnnotatedField af) {
+ JsonProperty propertyAnnotation = af.getAnnotation(JsonProperty.class);
+ if (propertyAnnotation != null) {
+ return propertyAnnotation.value();
+ }
+
+ if (af.hasAnnotation(JsonSerialize.class)) {
+ return "";
+ }
+ return null;
+ }
+
+ public String findSerializationName(AnnotatedMethod am) {
+ JsonProperty propertyAnnotation = am.getAnnotation(JsonProperty.class);
+ if (propertyAnnotation != null) {
+ return propertyAnnotation.value();
+ }
+
+ if (am.hasAnnotation(JsonSerialize.class)) {
+ return "";
+ }
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public boolean hasCreatorAnnotation(Annotated a) {
+ return a.hasAnnotation(JsonCreator.class);
+ }
+
+ @Override
+ public boolean hasIgnoreMarker(AnnotatedMember am) {
+ JsonIgnore ignoreAnnotation = am.getAnnotation(JsonIgnore.class);
+ return (ignoreAnnotation != null && ignoreAnnotation.value());
+ }
+
+ /*
+ * handling of serializers
+ */
+ @Override
+ public Object findSerializer(Annotated a) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<? extends JsonSerializer<?>> serClass =
serializeAnnotation.using();
+ if (serClass != JsonSerializer.None.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Object findKeySerializer(Annotated a) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<? extends JsonSerializer<?>> serClass =
serializeAnnotation.keyUsing();
+ if (serClass != JsonSerializer.None.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Object findContentSerializer(Annotated a) {
+ JsonSerialize serializeAnnotation = a.getAnnotation(JsonSerialize.class);
+ if (serializeAnnotation != null) {
+ Class<? extends JsonSerializer<?>> serClass =
serializeAnnotation.contentUsing();
+ if (serClass != JsonSerializer.None.class) {
+ return serClass;
+ }
+ }
+ return null;
+ }
+}
diff --git
a/zookeeper-api/src/test/java/org/apache/helix/zookeeper/datamodel/serializer/TestZNRecordSerializeWriteSizeLimit.java
b/zookeeper-api/src/test/java/org/apache/helix/zookeeper/datamodel/serializer/TestZNRecordSerializeWriteSizeLimit.java
index 011b1b6..fc9fa77 100644
---
a/zookeeper-api/src/test/java/org/apache/helix/zookeeper/datamodel/serializer/TestZNRecordSerializeWriteSizeLimit.java
+++
b/zookeeper-api/src/test/java/org/apache/helix/zookeeper/datamodel/serializer/TestZNRecordSerializeWriteSizeLimit.java
@@ -27,6 +27,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.helix.zookeeper.constant.ZkSystemPropertyKeys;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.introspect.CodehausJacksonIntrospector;
import org.apache.helix.zookeeper.util.GZipCompressionUtil;
import org.apache.helix.zookeeper.zkclient.exception.ZkMarshallingError;
import org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
@@ -187,6 +188,7 @@ public class TestZNRecordSerializeWriteSizeLimit {
// Returns raw serialized bytes before being compressed.
private byte[] serialize(Object data) {
ObjectMapper mapper = new ObjectMapper();
+ mapper.setAnnotationIntrospector(new CodehausJacksonIntrospector());
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.enable(MapperFeature.AUTO_DETECT_FIELDS);
mapper.enable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS);
diff --git a/zookeeper-api/zookeeper-api-1.0.2-SNAPSHOT.ivy
b/zookeeper-api/zookeeper-api-1.0.2-SNAPSHOT.ivy
index 97616ac..458c880 100644
--- a/zookeeper-api/zookeeper-api-1.0.2-SNAPSHOT.ivy
+++ b/zookeeper-api/zookeeper-api-1.0.2-SNAPSHOT.ivy
@@ -45,6 +45,7 @@ under the License.
</dependency>
<dependency org="com.fasterxml.jackson.core"
name="jackson-databind" rev="2.11.0" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="com.fasterxml.jackson.core"
name="jackson-core" rev="2.11.0" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
+ <dependency org="org.codehaus.jackson"
name="jackson-mapper-asl" rev="1.9.13" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="commons-cli" name="commons-cli" rev="1.2"
force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
<dependency org="org.apache.httpcomponents" name="httpclient"
rev="4.5.8" force="true"
conf="compile->compile(*),master(*);runtime->runtime(*)"/>
</dependencies>