Package info.atende.webutil.rest

Source Code of info.atende.webutil.rest.JacksonContextResolver$DefaultMapperConfig

package info.atende.webutil.rest;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.logging.Logger;

/**
* Customize the provider for JSON Serialization.
* It register Hibernate 4 Module to prevents Lazy Instantiation Exception, register the JodaModule and
* format the Date.<br>
* To override or custom the objectMapper, simple create a provider for {@link JacksonMapperConfig}
* @author Giovanni Silva
* Date: 6/4/13
* Time: 11:48 PM
*/

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
    private final static Logger logger = Logger.getLogger(JacksonContextResolver.class.getName());
    private ObjectMapper objectMapper;
    /**
     * User injected mapper config
     */
    @Inject
    private Instance<JacksonMapperConfig> mapperOverrides;
    /**
     * Default mapper config
     */
    private JacksonMapperConfig defaultConfig = new DefaultMapperConfig();
    // The default date format used in DefaultMapperConfig
    public final static String DEFAULT_DATE_FORMAT = "MM-dd-yyyy HH:mm:ss";
    @PostConstruct
    public void init() {
        this.objectMapper = new ObjectMapper();
        /**
         * Prevents Hibernate Lazy Instantiation
         */
        Hibernate4Module hm = new Hibernate4Module();
        this.objectMapper.registerModule(hm);
        // Correct Serialization of JDK 8 javax.time API's
        JSR310Module jsr310Module = new JSR310Module();
        this.objectMapper.registerModule(jsr310Module);
        /**
         * Configures de Mapper with DefaultMapperConfig
         */
        defaultConfig.configMapper(objectMapper);
        /**
         * Let the user provider overrides the defaultConfigs
         */
        JacksonMapperConfig mapperConfig = null;
        try {
            mapperConfig = mapperOverrides.get();
        }catch (Exception e){ // If a exception is throw, could not inject the bean. Use default Config
            logger.info("There is no configuration for JacksonMapperConfig. To customize Json Serialization " +
                    "add a provider for that");
        }

        if(mapperConfig != null){
            mapperConfig.configMapper(objectMapper);
        }


    }
    @Override
    public ObjectMapper getContext(Class<?> aClass) {
        return objectMapper;
    }

    /**
     * The default MapperConfig Implementation
     */
    private class DefaultMapperConfig implements JacksonMapperConfig {
        @Override
        public void configMapper(ObjectMapper mapper) {
            mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            DateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
            mapper.setDateFormat(dateFormat);
            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        }
    }
}
TOP

Related Classes of info.atende.webutil.rest.JacksonContextResolver$DefaultMapperConfig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.