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..dfb07f7713 --- /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("zull")); + Assert.assertTrue(response.equals(LowPriorityExceptionMapper.class.getSimpleName())); + } +}