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 Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate