RestTemplate Spring 启动中的 NullPointerException MediaType

Posted

技术标签:

【中文标题】RestTemplate Spring 启动中的 NullPointerException MediaType【英文标题】:NullPointerException MediaType in RestTemplate Spring boot 【发布时间】:2021-06-19 03:11:27 【问题描述】:

我正在将 Spring Boot 应用程序从 1.5.6.Release 更新到 2.3.5,但在构建项目时出现异常。 以下是我的错误类:

@Configuration
@EnableBatchProcessing
@Import(BatchScheduler.class)
public class MyLogBatchConfiguration 

  private static final Logger log = LoggerFactory.getLogger(MyLogBatchConfiguration.class);

  @Autowired private SimpleJobLauncher jobLauncher;

  @Autowired
  @Qualifier(value = "dataSource1")
  public DataSource mainDataSource;

  @Autowired
  @Qualifier(value = "dataSource2")
  public DataSource tempDataSource;

  @Autowired public StepBuilderFactory stepBuilderFactory;

  @Autowired public JobBuilderFactory jobBuilderFactory;

  
  @Autowired private RestTemplate myRestTemplate;

  @Qualifier(value = "createLocalSessionFactory")
  @Autowired
  private SessionFactory createLocalSessionFactory;

  @Qualifier(value = "createSessionFactory")
  @Autowired
  private SessionFactory createSessionFactory;

  @Bean
  RestTemplate restTemplate(RestTemplateBuilder builder) 
    RestTemplate restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
    for (HttpMessageConverter<?> converter : converters) 
      if (converter instanceof MappingJackson2HttpMessageConverter) 
        MappingJackson2HttpMessageConverter jsonConverter =
            (MappingJackson2HttpMessageConverter) converter;
        jsonConverter.setObjectMapper(new ObjectMapper());
        jsonConverter.setSupportedMediaTypes(
            ImmutableList.of(
                new MediaType(
                    "application", "json", MappingJackson2HttpMessageConverter.DEFAULT_CHARSET),
                new MediaType(
                    "text", "javascript", MappingJackson2HttpMessageConverter.DEFAULT_CHARSET)));
      
    
    return restTemplate;
  

  @Bean
  public LocalSessionFactoryBean createLocalSessionFactory(
      @Qualifier("dataSource1") DataSource dataSource) 
    LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setPackagesToScan(
        new String[] 
          "X",
          "Y",
          "Z"
        );
    factory.setHibernateProperties(hibernateProperties());
    return factory;
  

  @Bean
  public LocalSessionFactoryBean createSessionFactory(
      @Qualifier("dataSource2") DataSource dataSource) 
    LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
    factory.setDataSource(dataSource);
    factory.setPackagesToScan(
        new String[] 
          "X",
          "Y",
          "Z"
        );
    factory.setHibernateProperties(hibernateProperties());
    return factory;
  

我收到以下错误: :

> org.springframework.beans.factory.UnsatisfiedDependencyException: > 创建名为“MyLogBatchConfiguration”的 bean 时出错:不满意 > 通过字段“myRestTemplate”表达的依赖关系;嵌套异常 > 是 org.springframework.beans.factory.UnsatisfiedDependencyException: > 创建名为“batchConfiguration”的 bean 时出错:不满意 > 通过字段“myRestTemplate”表达的依赖关系;嵌套异常 > 是 org.springframework.beans.factory.BeanCreationException: 错误 > 创建在类路径资源中定义的名称为“restTemplate”的 bean > [com//configuration/MyLogBatchConfiguration.class]:Bean 实例化 > 通过工厂方法失败;嵌套异常是 > org.springframework.beans.BeanInstantiationException: 失败 > 实例化 [org.springframework.web.client.RestTemplate]:循环 > 涉及包含 bean 'MyLogBatchConfiguration' 的参考 - > 考虑将工厂方法声明为静态以独立于 > 它的包含实例。工厂方法“restTemplate”抛出 > 例外;嵌套异常是 java.lang.NullPointerException at > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) > 在 > org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) > 在 > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) > 在 > org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) > ] 在 > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > 在 java.lang.reflect.Method.invoke(Method.java:498) 在 > org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) > 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:107) > 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:58) > 在 > org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) > 原因: > org.springframework.beans.factory.UnsatisfiedDependencyException: > 创建名为“batchConfiguration”的 bean 时出错:不满意 > 通过字段“myRestTemplate”表达的依赖关系;嵌套异常 > 是 org.springframework.beans.factory.BeanCreationException: 错误 > 创建在类路径资源中定义的名称为“restTemplate”的 bean > [com//configuration/MyLogBatchConfiguration.class]:Bean 实例化 > 通过工厂方法失败;嵌套异常是 > org.springframework.beans.BeanInstantiationException: 失败 > 实例化 [org.springframework.web.client.RestTemplate]:循环 > 涉及包含 bean 'MyLogBatchConfiguration' 的参考 - > 考虑将工厂方法声明为静态以独立于 > 它的包含实例。工厂方法“restTemplate”抛出 > 例外;嵌套异常是 java.lang.NullPointerException at > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) > 在 > org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) > 在 > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420) > 在 > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) > 在 > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) > 在 > org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) > 在 > org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1307) > 在 > org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1227) > 在 > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) > ...省略了28个常见帧原因: > org.springframework.beans.factory.BeanCreationException:错误 > 创建在类路径资源中定义的名称为“restTemplate”的 bean > [com/*/configuration/MyLogBatchConfiguration.class]: 豆 > 通过工厂方法实例化失败;嵌套异常是 > org.springframework.beans.BeanInstantiationException: 失败 > 实例化 [org.springframework.web.client.RestTemplate]:循环 > 涉及包含 bean 'MyLogBatchConfiguration' 的参考 - > 考虑将工厂方法声明为静态以独立于 > 它的包含实例。工厂方法“restTemplate”抛出 > 例外;嵌套异常是 java.lang.NullPointerException at > org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655) > 在 > org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:635) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1176) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:556) > 在 > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) > 在 > org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1307) > 在 > org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1227) > 在 > org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) > ...省略50个常见帧原因: > org.springframework.beans.BeanInstantiationException: 失败 > 实例化 [org.springframework.web.client.RestTemplate]:循环 > 涉及包含 bean 'MyLogBatchConfiguration' 的参考 - > 考虑将工厂方法声明为静态以独立于 > 它的包含实例。工厂方法“restTemplate”抛出 > 例外;嵌套异常是 java.lang.NullPointerException at > org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) > 在 > org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650) > ...省略了63个常见框架原因: > java.lang.NullPointerException: null at > org.springframework.util.MimeType.(MimeType.java:143) 在 > org.springframework.http.MediaType.(MediaType.java:433)

我省略了一些中间堆栈跟踪以保留重要行。它在 1.5.6 发布版本中运行良好。 主要原因是最后一行,它适用于

MimeType.java 媒体类型.Java

并抛出空指针异常。如何正确传递 MediaTypes ?我确实在 Eclipse 中看到了一个警告:

The field AbstractJackson2HttpMessageConverter.DEFAULT_CHARSET is 
 deprecated

感谢任何处理 Null 媒体类型的解决方法。

【问题讨论】:

请您提供完整的堆栈跟踪 我已经更新了。如果您需要更多信息,请告诉我。我之前认为这是一些堆栈跟踪中提到的循环依赖问题,但我尝试删除它,但错误仍然存​​在,然后我在日志底部看到,我得到了一些 MediaType Null 指针异常,这就是为什么没有创建 restTemplate Bean。 看看这篇文章,看看是否有帮助,让我知道***.com/questions/58525387/… 我已经更新了上面评论中的链接 我用 StandardCharsets.UTF_8 替换了 MappingJackson2HttpMessageConverter.DEFAULT_CHARSET 语句,但它仍然给出相同的错误。链接应该只这样做。对吗? 【参考方案1】:

这是 2.2.0 spring-boot 的问题。他们为默认字符集编码设置了弃用。

尝试用以下两种类型替换。 json和文本,

new MediaType("application", "json", MappingJackson2HttpMessageConverter. StandardCharsets.UTF_8))

【讨论】:

以上是关于RestTemplate Spring 启动中的 NullPointerException MediaType的主要内容,如果未能解决你的问题,请参考以下文章

Spring RestTemplate实现服务间的远程调用完整代码示例

Spring的RestTemplate

如何从 Spring RestTemplate 中的对象获取列表

Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate

Spring restTemplate 中的 START_ARRAY 令牌

正文中的 Spring Boot OAuth2RestTemplate 客户端凭据