如果类路径中不存在JACKSON,为什么Spring不会向AbstractHttpMessageConverter显示编译错误

时间:2015-12-15 19:26:29

标签: json spring spring-mvc

Spring文档说Jackson 2 API应该存在于MappingJackson2HttpMessageConverter的类路径中。

在MappingJackson2HttpMessageConverter的源代码中,Spring从jackson API导入类。

31 - > import com.fasterxml.jackson.core.JsonEncoding;
32 - > import com.fasterxml.jackson.core.JsonGenerator;
33 - > import com.fasterxml.jackson.databind.JavaType;
34 - > import com.fasterxml.jackson.databind.ObjectMapper;

现在我的问题是,如果类路径中没有JACKSON,那么MappingJackson2HttpMessageConverter中的上述代码应该抛出编译时错误。但为什么这个类没有任何编译错误。

1 个答案:

答案 0 :(得分:3)

首先,Spring使用反射来确定Jackson库是否在类路径上。您可以在WebMvcConfigurationSupport中看到这一点:

private static final boolean jackson2Present =
        ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", 
            WebMvcConfigurationSupport.class.getClassLoader()) &&
        ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",       
            WebMvcConfigurationSupport.class.getClassLoader());

现在WebMvcConfigurationSupport本身也有以下内容:import com.fasterxml.jackson.databind.ObjectMapper;

但有两件事情在这里发挥作用:

  • 在编译时需要这些类适用于Spring Framework ,而不是您的应用程序;就像Spring支持的所有库一样,它们是Spring构建中的可选依赖项
  • 这些类,即使在类中声明为导入,也仅在使用/读取时由JVM加载。

同样的限制适用于Spring 4.x,因为它支持JDK8,同时仍然在使用JDK6 +。请参阅this blog post for more details