diff --git a/build.gradle b/build.gradle index c5f08d132..139850a05 100644 --- a/build.gradle +++ b/build.gradle @@ -194,7 +194,7 @@ project("spring-data-rest-webmvc") { // Jackson compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jacksonVersion" - compile "com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:$jacksonVersion" + compile("com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:$jacksonVersion", optional) // Testing testCompile "org.eclipse.jetty:jetty-servlet:$jettyVersion" @@ -213,6 +213,7 @@ project("spring-data-rest-webmvc") { testCompile "joda-time:joda-time:$jodaVersion" // Hibernate + compile("org.hibernate:hibernate-core:$hibernateVersion", optional) testRuntime "org.hibernate:hibernate-entitymanager:$hibernateVersion" testRuntime "org.hibernate:hibernate-validator:$hibernateValidatorVersion" // HSQL @@ -266,7 +267,7 @@ project("spring-data-rest-example") { // Jackson compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jacksonVersion" - compile "com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:$jacksonVersion" + compile("com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:$jacksonVersion", optional) // Hibernate runtime "org.hibernate:hibernate-entitymanager:$hibernateVersion" diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/Jackson2DatatypeHelper.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/Jackson2DatatypeHelper.java index 26cad384c..9d54d4e43 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/Jackson2DatatypeHelper.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/Jackson2DatatypeHelper.java @@ -1,46 +1,76 @@ +/* + * Copyright 2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.springframework.data.rest.webmvc.json; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.hibernate.Version; import org.springframework.util.ClassUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module; +import com.fasterxml.jackson.datatype.joda.JodaModule; + /** * Helper class to register datatype modules based on their presence in the classpath. * * @author Jon Brisbin + * @author Oliver Gierke */ public class Jackson2DatatypeHelper { - private static final Logger LOG = LoggerFactory.getLogger(Jackson2DatatypeHelper.class); + private static final boolean IS_HIBERNATE_AVAILABLE = ClassUtils.isPresent("org.hibernate.Version", + Jackson2DatatypeHelper.class.getClassLoader()); private static final boolean IS_HIBERNATE4_MODULE_AVAILABLE = ClassUtils.isPresent( "com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module", Jackson2DatatypeHelper.class.getClassLoader()); + private static final boolean IS_JODA_MODULE_AVAILABLE = ClassUtils.isPresent( "com.fasterxml.jackson.datatype.joda.JodaModule", Jackson2DatatypeHelper.class.getClassLoader()); public static void configureObjectMapper(ObjectMapper mapper) { + // Hibernate types - if (IS_HIBERNATE4_MODULE_AVAILABLE) { - try { - mapper.registerModule((Module) Class.forName("com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module") - .newInstance()); - } catch (Throwable t) { - if (LOG.isDebugEnabled()) { - LOG.debug(t.getMessage(), t); - } - } + if (IS_HIBERNATE_AVAILABLE && Hibernate4Checker.isHibernate4() && IS_HIBERNATE4_MODULE_AVAILABLE) { + Hibernate4ModuleRegistrar.registerModule(mapper); } + // JODA time if (IS_JODA_MODULE_AVAILABLE) { - try { - mapper.registerModule((Module) Class.forName("com.fasterxml.jackson.datatype.joda.JodaModule").newInstance()); - } catch (Throwable t) { - if (LOG.isDebugEnabled()) { - LOG.debug(t.getMessage(), t); - } - } + JodaModuleRegistrar.registerModule(mapper); } } + private static class Hibernate4Checker { + + public static boolean isHibernate4() { + return Version.getVersionString().startsWith("4"); + } + } + + private static class Hibernate4ModuleRegistrar { + + public static void registerModule(ObjectMapper mapper) { + mapper.registerModule(new Hibernate4Module()); + } + } + + private static class JodaModuleRegistrar { + + public static void registerModule(ObjectMapper mapper) { + mapper.registerModule(new JodaModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + } + } }