MyJsonMapperProvider.java

/*
 * Copyright (c) 2010, 2022, 2026 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0, which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.glassfish.jersey.examples.jackson3;

import tools.jackson.databind.json.JsonMapper;
import jakarta.ws.rs.ext.ContextResolver;
import jakarta.ws.rs.ext.Provider;

import tools.jackson.databind.AnnotationIntrospector;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.SerializationFeature;
import tools.jackson.databind.introspect.JacksonAnnotationIntrospector;
import tools.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector;

/**
 * TODO javadoc.
 *
 * @author Jakub Podlesak
 */
@Provider
public class MyJsonMapperProvider implements ContextResolver<JsonMapper> {

    final JsonMapper defaultJsonMapper;
    final JsonMapper combinedJsonMapper;

    public MyJsonMapperProvider() {
        defaultJsonMapper = createDefaultMapper();
        combinedJsonMapper = createCombinedMapper();
    }

    @Override
    public JsonMapper getContext(final Class<?> type) {

        if (type == CombinedAnnotationBean.class) {
            return combinedJsonMapper;
        } else {
            return defaultJsonMapper;
        }
    }

    private static JsonMapper createCombinedMapper() {
        return JsonMapper.builder()
                .enable(SerializationFeature.WRAP_ROOT_VALUE)
                .enable(DeserializationFeature.UNWRAP_ROOT_VALUE)
                .annotationIntrospector(createJaxbJacksonAnnotationIntrospector())
                .build();
    }

    private static JsonMapper createDefaultMapper() {
        return JsonMapper.builder()
                .enable(SerializationFeature.INDENT_OUTPUT)
                .build();
    }

    private static AnnotationIntrospector createJaxbJacksonAnnotationIntrospector() {

        final AnnotationIntrospector jaxbIntrospector = new JakartaXmlBindAnnotationIntrospector();
        final AnnotationIntrospector jacksonIntrospector = new JacksonAnnotationIntrospector();

        return AnnotationIntrospector.pair(jacksonIntrospector, jaxbIntrospector);
    }
}