JDK1.6下Spring Boot REST客户端类型匹配错误求助
问题排查与修复方案
嘿,我来帮你解决这个问题!咱们先拆解一下你遇到的错误和代码里的问题:
直接错误原因:语法+泛型类型不匹配
你看到的The method setSupportedMediaTypes(List<MediaType>)...错误,主要是两个问题导致的:
- 你写的
Arrays.asList({MediaType.ALL})是无效的Java语法,正确的写法应该是Arrays.asList(MediaType.ALL)(去掉大括号); - JDK1.6的泛型推断能力比较弱,即使修正语法,
Arrays.asList(MediaType.ALL)会被推断为List<Object>,而setSupportedMediaTypes需要的是List<MediaType>,类型不兼容。
另外,你的代码里还缺少MediaType类的导入,这也会导致编译报错。
分步修复指南
1. 补上缺失的导入
在Application.java的导入区添加:
import org.springframework.http.MediaType;
2. 修正setSupportedMediaTypes的调用
把错误的写法替换成以下两种兼容JDK1.6的方式:
方式一:显式指定泛型类型
通过显式声明泛型,让编译器明确返回的是List<MediaType>:
converter.setSupportedMediaTypes(Arrays.<MediaType>asList(MediaType.ALL));
方式二:手动创建List(更直观)
如果觉得泛型语法麻烦,直接创建ArrayList<MediaType>并添加元素:
List<MediaType> mediaTypes = new ArrayList<MediaType>(); mediaTypes.add(MediaType.ALL); converter.setSupportedMediaTypes(mediaTypes);
3. 别忘了把转换器设置到RestTemplate!
你当前代码里创建了messageConverters列表,但没有把它绑定到restTemplate上,这会导致你自定义的Jackson转换器根本不会生效。必须添加这一行:
restTemplate.setMessageConverters(messageConverters);
放在messageConverters.add(converter);之后、调用restTemplate.getForObject()之前。
4. JDK1.6兼容的依赖调整
你用的Jackson 2.9.x版本最低要求JDK1.7,这在JDK1.6上会运行报错。需要把Jackson依赖降级到支持JDK1.6的2.8.x版本,比如2.8.11:
修改pom.xml里的Jackson相关依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.11</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.11</version> </dependency> <!-- 必须添加databind,因为MappingJackson2HttpMessageConverter依赖它 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.11</version> </dependency>
修复后的完整run方法
@Override public void run(String... args) throws Exception { List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); //Add the Jackson Message converter MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); // Note: here we are making this converter to process any kind of response, // not only application/*json, which is the default behaviour List<MediaType> mediaTypes = new ArrayList<MediaType>(); mediaTypes.add(MediaType.ALL); converter.setSupportedMediaTypes(mediaTypes); messageConverters.add(converter); // 绑定转换器到RestTemplate restTemplate.setMessageConverters(messageConverters); Quote quote = restTemplate.getForObject( "http://gturnquist-quoters.cfapps.io/api/random", Quote.class); log.info(quote.toString()); }
这样调整后,你的代码应该就能在JDK1.6环境下正常编译和运行了。
内容的提问来源于stack exchange,提问作者N Kan
相关产品推荐
相关产品推荐

