diff --git a/core/src/main/java/org/infinispan/encoding/DataConversion.java b/core/src/main/java/org/infinispan/encoding/DataConversion.java
index 25fb07858c60..9831ad4040f0 100644
--- a/core/src/main/java/org/infinispan/encoding/DataConversion.java
+++ b/core/src/main/java/org/infinispan/encoding/DataConversion.java
@@ -170,7 +170,9 @@ private void lookupTranscoder(EncoderRegistry encoderRegistry) {
}
}
if (directTranscoder != null) {
- encoder = IdentityEncoder.INSTANCE;
+ if (encoder.getStorageFormat().equals(MediaType.APPLICATION_OBJECT)) {
+ encoder = IdentityEncoder.INSTANCE;
+ }
transcoder = directTranscoder;
} else {
transcoder = encoderRegistry.getTranscoder(requestMediaType, storageMediaType);
diff --git a/integrationtests/compatibility-mode-it/pom.xml b/integrationtests/compatibility-mode-it/pom.xml
index c13d8b037ef1..6a271ee1641a 100644
--- a/integrationtests/compatibility-mode-it/pom.xml
+++ b/integrationtests/compatibility-mode-it/pom.xml
@@ -97,6 +97,11 @@
testng
test
+
+ org.codehaus.jackson
+ jackson-mapper-asl
+ test
+
\ No newline at end of file
diff --git a/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/BaseJsonTest.java b/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/BaseJsonTest.java
index 45b5ef33115b..6bc5cbe1e783 100644
--- a/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/BaseJsonTest.java
+++ b/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/BaseJsonTest.java
@@ -3,6 +3,7 @@
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.killServers;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.startHotRodServer;
+import static org.infinispan.rest.JSONConstants.TYPE;
import static org.infinispan.server.core.test.ServerTestingUtil.findFreePort;
import static org.infinispan.test.TestingUtil.killCacheManagers;
import static org.testng.Assert.assertEquals;
@@ -20,6 +21,7 @@
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.node.ObjectNode;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.Search;
@@ -43,11 +45,12 @@
@Test(groups = "functional")
public abstract class BaseJsonTest extends AbstractInfinispanTest {
- protected RestServer restServer;
- protected HttpClient restClient;
+ RestServer restServer;
+ HttpClient restClient;
private EmbeddedCacheManager cacheManager;
private RemoteCacheManager remoteCacheManager;
private RemoteCache remoteCache;
+ private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String CACHE_NAME = "indexed";
@@ -85,8 +88,11 @@ protected void setup() throws Exception {
private void writeCurrencyViaJson(String key, String description, int rank) throws IOException {
EntityEnclosingMethod put = new PutMethod(restEndpoint + "/" + key);
- String json = String.format("{\"_type\":\"%s\",\"description\":\"%s\",\"rank\":%d}", getEntityName(), description, rank);
- put.setRequestEntity(new StringRequestEntity(json, "application/json", "UTF-8"));
+ ObjectNode currency = MAPPER.createObjectNode();
+ currency.put(TYPE, getEntityName());
+ currency.put("description", description);
+ currency.put("rank", rank);
+ put.setRequestEntity(new StringRequestEntity(currency.toString(), "application/json", "UTF-8"));
restClient.executeMethod(put);
System.out.println(put.getResponseBodyAsString());
diff --git a/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/EmbeddedRestHotRodTest.java b/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/EmbeddedRestHotRodTest.java
index 0279d55e2c42..6f5c3bc62024 100644
--- a/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/EmbeddedRestHotRodTest.java
+++ b/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/EmbeddedRestHotRodTest.java
@@ -1,5 +1,6 @@
package org.infinispan.it.compatibility;
+import static org.infinispan.rest.JSONConstants.TYPE;
import static org.testng.AssertJUnit.assertArrayEquals;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
@@ -28,6 +29,8 @@
import org.apache.commons.httpclient.methods.HeadMethod;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PutMethod;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.node.ObjectNode;
import org.infinispan.client.hotrod.Flag;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.commons.dataconversion.IdentityEncoder;
@@ -49,6 +52,8 @@ public class EmbeddedRestHotRodTest extends AbstractInfinispanTest {
private static final DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+
CompatibilityCacheFactory cacheFactory;
@BeforeClass
@@ -170,7 +175,7 @@ public void testCustomObjectEmbeddedPutRestGetAcceptJSONAndXML() throws Exceptio
getJson.setRequestHeader("Accept", "application/json");
cacheFactory.getRestClient().executeMethod(getJson);
assertEquals(getJson.getStatusText(), HttpStatus.SC_OK, getJson.getStatusCode());
- assertEquals("{\"_type\":\"" + Person.class.getName() + "\",\"name\":\"Anna\"}", getJson.getResponseBodyAsString());
+ assertEquals(asJson(p), getJson.getResponseBodyAsString());
// 3. Get with REST (accept application/xml)
HttpMethod getXml = new GetMethod(cacheFactory.getRestUrl() + "/" + key);
@@ -193,7 +198,7 @@ public void testCustomObjectHotRodPutRestGetAcceptJSONAndXML() throws Exception
getJson.setRequestHeader("Accept", "application/json");
cacheFactory.getRestClient().executeMethod(getJson);
assertEquals(getJson.getStatusText(), HttpStatus.SC_OK, getJson.getStatusCode());
- assertEquals("{\"_type\":\"" + Person.class.getName() + "\",\"name\":\"Jakub\"}", getJson.getResponseBodyAsString());
+ assertEquals(asJson(p), getJson.getResponseBodyAsString());
// 3. Get with REST (accept application/xml)
HttpMethod getXml = new GetMethod(cacheFactory.getRestUrl() + "/" + key);
@@ -397,6 +402,13 @@ public void testHotRodEmbeddedPutRestGetCacheControlHeader() throws Exception {
assertEquals("v2", getKey2.getResponseBodyAsString());
}
+ private String asJson(Person p) {
+ ObjectNode person = MAPPER.createObjectNode();
+ person.put(TYPE, p.getClass().getName());
+ person.put("name", p.name);
+ return person.toString();
+ }
+
/**
* The class needs a getter for the attribute "name" so that it can be converted to JSON format
* internally by the REST server.
diff --git a/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/AbstractCompatRemoteQueryManager.java b/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/AbstractCompatRemoteQueryManager.java
index e47c5c9eb78d..c91611bddf51 100644
--- a/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/AbstractCompatRemoteQueryManager.java
+++ b/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/AbstractCompatRemoteQueryManager.java
@@ -6,6 +6,7 @@
import org.infinispan.commons.dataconversion.Encoder;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.factories.ComponentRegistry;
+import org.infinispan.marshall.core.EncoderRegistry;
import org.infinispan.objectfilter.Matcher;
import org.infinispan.objectfilter.impl.syntax.parser.EntityNameResolver;
import org.infinispan.protostream.SerializationContext;
@@ -26,8 +27,10 @@ abstract class AbstractCompatRemoteQueryManager implements RemoteQueryManager {
protected final SerializationContext ctx;
protected final boolean isIndexed;
+ final EncoderRegistry encoderRegistry;
AbstractCompatRemoteQueryManager(ComponentRegistry cr) {
+ this.encoderRegistry = cr.getGlobalComponentRegistry().getComponent(EncoderRegistry.class);
SearchIntegrator searchIntegrator = cr.getComponent(SearchIntegrator.class);
AdvancedCache, ?> cache = cr.getComponent(Cache.class).getAdvancedCache();
Configuration cfg = cr.getComponent(Configuration.class);
diff --git a/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/GenericCompatRemoteQueryManager.java b/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/GenericCompatRemoteQueryManager.java
index 7e2ba9ba5f21..bde2f86d6eb4 100644
--- a/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/GenericCompatRemoteQueryManager.java
+++ b/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/GenericCompatRemoteQueryManager.java
@@ -1,8 +1,14 @@
package org.infinispan.query.remote.impl;
+import static java.util.stream.Collectors.toList;
+import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_JSON;
+import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_OBJECT;
+
+import java.util.List;
import java.util.Set;
import org.hibernate.search.spi.SearchIntegrator;
+import org.infinispan.commons.dataconversion.Transcoder;
import org.infinispan.factories.ComponentRegistry;
import org.infinispan.objectfilter.impl.syntax.parser.EntityNameResolver;
import org.infinispan.objectfilter.impl.syntax.parser.ReflectionEntityNamesResolver;
@@ -10,6 +16,7 @@
import org.infinispan.query.backend.QueryInterceptor;
import org.infinispan.query.remote.client.QueryRequest;
import org.infinispan.query.remote.client.QueryResponse;
+import org.infinispan.query.remote.impl.util.LazyRef;
/**
* Handle remote queries with deserialized object storage using the configured compat mode marshaller.
@@ -18,6 +25,9 @@
*/
class GenericCompatRemoteQueryManager extends AbstractCompatRemoteQueryManager {
+ private LazyRef transcoder =
+ new LazyRef<>(() -> encoderRegistry.getTranscoder(APPLICATION_OBJECT, APPLICATION_JSON));
+
GenericCompatRemoteQueryManager(ComponentRegistry cr) {
super(cr);
}
@@ -55,6 +65,12 @@ public QueryRequest decodeQueryRequest(byte[] queryRequest) {
return (QueryRequest) getValueEncoder().toStorage(queryRequest);
}
+ @Override
+ public List