From 585271f1c0b8a3e6d421822fc904be9f6b7bbdff Mon Sep 17 00:00:00 2001 From: Jan Supol Date: Wed, 14 Aug 2019 14:05:13 +0200 Subject: [PATCH 1/2] Add an option to not register the Jackson's ExceptionMappers by JacksonFeature Signed-off-by: Jan Supol --- .../jersey/jackson/JacksonFeature.java | 44 ++++++++++-- .../json/JsonWithoutExceptionMapperTest.java | 70 +++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/JacksonFeature.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/JacksonFeature.java index d85cc0a7e2..2ab250176e 100644 --- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/JacksonFeature.java +++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/JacksonFeature.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -40,6 +40,39 @@ */ public class JacksonFeature implements Feature { + /** + * Define whether to use Jackson's exception mappers ore not + * Using them can provide a useful information to the user, but it can expose unnecessary information, too. + */ + private final boolean registerExceptionMappers; + + /** + * Default constructor enables registering Jackson's exception mappers + */ + public JacksonFeature() { + this(true); + } + + private JacksonFeature(boolean registerExceptionMappers) { + this.registerExceptionMappers = registerExceptionMappers; + } + + /** + * Create JacksonFeature with working Jackson's exception mappers + * @return JacksonFeature with working Jackson's exception mappers + */ + public static JacksonFeature withExceptionMappers() { + return new JacksonFeature(); + } + + /** + * Create JacksonFeature without registered Jackson's exception mappers + * @return JacksonFeature without registered Jackson's exception mappers + */ + public static JacksonFeature withoutExceptionMappers() { + return new JacksonFeature(false); + } + private static final String JSON_FEATURE = JacksonFeature.class.getSimpleName(); @Override @@ -59,9 +92,12 @@ public boolean configure(final FeatureContext context) { // Register Jackson. if (!config.isRegistered(JacksonJaxbJsonProvider.class)) { - // add the default Jackson exception mappers - context.register(JsonParseExceptionMapper.class); - context.register(JsonMappingExceptionMapper.class); + + if (registerExceptionMappers) { + // add the default Jackson exception mappers + context.register(JsonParseExceptionMapper.class); + context.register(JsonMappingExceptionMapper.class); + } if (EntityFilteringFeature.enabled(config)) { context.register(JacksonFilteringFeature.class); diff --git a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java new file mode 100644 index 0000000000..cc2944eac1 --- /dev/null +++ b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package org.glassfish.jersey.tests.e2e.json; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Assert; +import org.junit.Test; + +import javax.annotation.Priority; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.Path; +import javax.ws.rs.POST; +import javax.ws.rs.Priorities; + +public class JsonWithoutExceptionMapperTest extends JerseyTest { + + public static class BooleanEntity { + public boolean data; + } + + @Priority(2 * Priorities.USER) + public static class LowPriorityExceptionMapper implements ExceptionMapper { + @Override + public Response toResponse(Exception exception) { + return Response.accepted().entity(getClass().getSimpleName()).build(); + } + } + + @Path("/") + public static class Resource { + @POST + public Boolean value(BooleanEntity entity) { + return entity.data; + } + } + + @Override + protected Application configure() { + return new ResourceConfig(Resource.class, LowPriorityExceptionMapper.class) + .register(JacksonFeature.withoutExceptionMappers()); + } + + @Test + public void testZullBooleanValue() { + String response = target().request(MediaType.APPLICATION_JSON) + .buildPost(Entity.entity("zull", MediaType.APPLICATION_JSON_TYPE)).invoke().readEntity(String.class); + Assert.assertFalse(response.contains("Unrecognized token 'zull'")); + Assert.assertTrue(response.equals(LowPriorityExceptionMapper.class.getSimpleName())); + } +} From 7873a70907875fa3f131193e51e3ee1ac668c424 Mon Sep 17 00:00:00 2001 From: Jan Supol Date: Mon, 19 Aug 2019 16:33:58 +0200 Subject: [PATCH 2/2] Check only "zull" from the response Signed-off-by: Jan Supol --- .../jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java index cc2944eac1..dfb07f7713 100644 --- a/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java +++ b/tests/e2e-entity/src/test/java/org/glassfish/jersey/tests/e2e/json/JsonWithoutExceptionMapperTest.java @@ -64,7 +64,7 @@ protected Application configure() { public void testZullBooleanValue() { String response = target().request(MediaType.APPLICATION_JSON) .buildPost(Entity.entity("zull", MediaType.APPLICATION_JSON_TYPE)).invoke().readEntity(String.class); - Assert.assertFalse(response.contains("Unrecognized token 'zull'")); + Assert.assertFalse(response.contains("zull")); Assert.assertTrue(response.equals(LowPriorityExceptionMapper.class.getSimpleName())); } }