Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an option to not register the Jackson's ExceptionMappers by JacksonFeature #4225

Merged
merged 2 commits into from Aug 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -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
Expand Down Expand Up @@ -40,6 +40,39 @@
*/
public class JacksonFeature implements Feature {

/**
* Define whether to use Jackson's exception mappers ore not

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in "ore"

* 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
Expand All @@ -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);
Expand Down
@@ -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<Exception> {
@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()));
}
}