From 55bdd495afd00d918f38e8f8a1a64afd1f272384 Mon Sep 17 00:00:00 2001 From: Alessio Soldano Date: Fri, 12 May 2017 18:19:43 +0200 Subject: [PATCH] [RESTEASY-1532] Disable JsonGenerator.Feature.AUTO_CLOSE_TARGET --- .../jackson/ResteasyJackson2Provider.java | 1 + .../jackson2/ExceptionMapperMarshalTest.java | 12 +++++++++ .../ExceptionMapperIOExceptionMapper.java | 25 +++++++++++++++++++ .../ExceptionMapperMarshalResource.java | 14 ++++++++++- .../providers/jackson2/resource/MyEntity.java | 10 ++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperIOExceptionMapper.java create mode 100644 testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/MyEntity.java diff --git a/providers/jackson2/src/main/java/org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider.java b/providers/jackson2/src/main/java/org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider.java index 1152e707932..62167729910 100755 --- a/providers/jackson2/src/main/java/org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider.java +++ b/providers/jackson2/src/main/java/org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider.java @@ -174,6 +174,7 @@ public void flush() throws IOException { */ JsonEncoding enc = findEncoding(mediaType, httpHeaders); JsonGenerator jg = writer.getFactory().createGenerator(entityStream, enc); + jg.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET); try { // Want indentation? diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/ExceptionMapperMarshalTest.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/ExceptionMapperMarshalTest.java index adcfa191e82..9fb14c12751 100644 --- a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/ExceptionMapperMarshalTest.java +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/ExceptionMapperMarshalTest.java @@ -6,11 +6,13 @@ import org.jboss.logging.Logger; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; +import org.jboss.resteasy.test.providers.jackson2.resource.ExceptionMapperIOExceptionMapper; import org.jboss.resteasy.test.providers.jackson2.resource.ExceptionMapperMarshalErrorMessage; import org.jboss.resteasy.test.providers.jackson2.resource.ExceptionMapperMarshalMyCustomException; import org.jboss.resteasy.test.providers.jackson2.resource.ExceptionMapperMarshalName; import org.jboss.resteasy.test.providers.jackson2.resource.ExceptionMapperMarshalMyCustomExceptionMapper; import org.jboss.resteasy.test.providers.jackson2.resource.ExceptionMapperMarshalResource; +import org.jboss.resteasy.test.providers.jackson2.resource.MyEntity; import org.jboss.resteasy.util.HttpResponseCodes; import org.jboss.resteasy.util.Types; import org.jboss.resteasy.utils.PortProviderUtil; @@ -47,6 +49,7 @@ public static Archive deploy() { WebArchive war = TestUtil.prepareArchive(ProxyWithGenericReturnTypeJacksonTest.class.getSimpleName()); war.addClass(Jackson2Test.class); return TestUtil.finishContainerPrepare(war, null, ExceptionMapperMarshalErrorMessage.class, ExceptionMapperMarshalMyCustomException.class, + MyEntity.class, ExceptionMapperIOExceptionMapper.class, ExceptionMapperMarshalMyCustomExceptionMapper.class, ExceptionMapperMarshalName.class, ExceptionMapperMarshalResource.class); } @@ -80,4 +83,13 @@ public void testCustomUsed() { }); Assert.assertEquals("The response has unexpected content", "error", errors.get(0).getError()); } + + @Test + public void testMyCustomUsed() { + Response response = client.target(generateURL("/resource/customME")).request().get(); + String text = response.readEntity(String.class); + + Assert.assertEquals(response.getStatus(), HttpResponseCodes.SC_OK); + Assert.assertTrue("Response does not contain UN_KNOWN_ERR", text.contains("UN_KNOWN_ERR")); + } } diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperIOExceptionMapper.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperIOExceptionMapper.java new file mode 100644 index 00000000000..4c225add03d --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperIOExceptionMapper.java @@ -0,0 +1,25 @@ +package org.jboss.resteasy.test.providers.jackson2.resource; + +import java.util.HashMap; +import java.util.Map; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +/** + * User: rsearls + * Date: 10/26/16 + */ +@Provider +public class ExceptionMapperIOExceptionMapper implements ExceptionMapper { + @Override + public Response toResponse(Throwable e) { + Map result = new HashMap<>(); + result.put("err_msg", "UN_KNOWN_ERR"); + result.put("err_detail", "please contact admin for help"); + return Response.status(Response.Status.OK).entity(result) + .type(MediaType.APPLICATION_JSON_TYPE).build(); + + } +} \ No newline at end of file diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperMarshalResource.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperMarshalResource.java index af76382c5f8..ab1c04e3676 100644 --- a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperMarshalResource.java +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/ExceptionMapperMarshalResource.java @@ -1,7 +1,12 @@ package org.jboss.resteasy.test.providers.jackson2.resource; +import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + import java.util.List; @Path("resource") @@ -12,5 +17,12 @@ public List custom() throws Throwable { throw new ExceptionMapperMarshalMyCustomException("hello"); } - + @GET + @Path("customME") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response test() { + MyEntity entity = new MyEntity(); + return Response.status(Response.Status.OK).entity(entity).build(); + } } diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/MyEntity.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/MyEntity.java new file mode 100644 index 00000000000..4da0b89fa1c --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/jackson2/resource/MyEntity.java @@ -0,0 +1,10 @@ +package org.jboss.resteasy.test.providers.jackson2.resource; + +/** + * A missing JSON annotation is intended. This causes the needed exception + * for testing. + * User: rsearls + * Date: 10/13/16 + */ +public class MyEntity { +}