RestTemplate java.lang.NoClassDefFoundError:com/fasterxml/jackson/core/util/DefaultIndenter

异常

使用new RestTemplate()报错,错误如下

java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

原因

RestTemplate默认使用jackson序列化,spring 4+需要配备jackson 2+的版本,由于jackson版本过低导致找不到类

解决

一:升级jackson

升级jackson版本,这也是网上绝大多数的解决方式,把jackson升级到最新版本

二:使用gson

由于很多公共包依赖jackson,贸然升级怕引发风险,所以改成使用gson这种序列化方式

  1. 添加gson依赖
<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.1</version>
</dependency>
  1. 配置restTemplate
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;
import java.util.List;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        List<HttpMessageConverter<?>> messageConverters = Collections.singletonList(new GsonHttpMessageConverter());
        RestTemplate restTemplate = new RestTemplate(messageConverters);
        restTemplate.setRequestFactory(factory);
        return restTemplate;
    }

    @Bean
    public ClientHttpRequestFactory requestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(15000);
        return factory;
    }
}
  1. 请求
@Service
public class EmployeesServiceImpl {

    @Autowired
    private RestTemplate restTemplate;

    public Employee employees(String id){
       
        String url = "http://xxxxx";
        ResponseEntity<Employee> responseEntity = restTemplate.exchange(url, HttpMethod.GET,entity,Employee.class, Collections.emptyMap());
        return responseEntity.getBody();
    }
}

三:自定义序列化

参照GsonHttpMessageConverter源代码,只要继承AbstractGenericHttpMessageConverter,并实现相应的方法就可以。例如:变成fastjson实现序列化

public class FastjonsHttpMessageCoverter extends AbstractGenericHttpMessageConverter {
    @Override
    protected void writeInternal(Object o, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
      
    }

    @Override
    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    @Override
    public Object read(Type type, Class contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值