Spring 4.2.4.RELEASE MVC 学习笔记 - 9 - MedaiType(咋个办呢 zgbn)

本文介绍如何在Spring MVC中实现不同的MediaType映射,如PDF、XLS等格式的文件输出,并探讨自定义数据解析器的方法。

Spring 4.2.4.RELEASE MVC 学习笔记 - 9 - MedaiType

本章是继续上一章节未完成任务的继续学习,之所以单独列出,只是因为避免章节内容过长不好阅读,其次是后续内容以自己编码实现的过程,没有可以直接整合的东西。


学习目标

URL后缀请求Mediatype映射学习目标
*.pdfapplication/pdf; charset=UTF-8Controller处理方法返回对象解析成pdf文件
*.xlsapplication/xls; charset=UTF-8Controller处理方法返回对象解析成xls文件
*.xlsxapplication/xlsx; charset=UTF-8Controller处理方法返回对象解析成xlsx文件


测试地址结果
http://127.0.0.1:8000/restfull/book.pdf将Result数据对象处理成pdf文件字节流返回
http://127.0.0.1:8000/restfull/book.xls将Result数据对象处理成xls文件字节流返回
http://127.0.0.1:8000/restfull/book.xlsx将Result数据对象处理成xlsx文件字节流返回

/restfull/book.pdf请求的实现

直接运行项目,在浏览器中访问/restfull/book.pdf地址,结果如下图。显而易见,直接返回406错误,没有返回正确的结果。
再看看请求头和响应头信息,请求头浏览器默认指定了Accept信息但是我们没有看到application/pdf,在看看响应头Content-Type信息为text/html,也不是我们想要的application/pdf结果。
这里写图片描述

第8章中,我们知晓了,浏览器中直接访问/restfull/book.pdf时,Spring MVC会通过URI的后缀”.pdf”解析出该请求MedaiType=application/pdf,然后优先遍历所有的实现了HttpMessageConverter接口的数据解析器,查看是否存在对应的数据解析器。然后我们日志中可以看出Spring MVC并没有找到MedaiType=application/pdf的数据解析器。

既然知道原因,剩下就好办了。

方法1:可以在看看Spring其他提供支持jar中是否有可以处理该MedaiType=application/pdf的数据解析器,如果有直接引入(和之前分析json和xml类似);

方法2:百度去找有没有第三方的工具jar,其中有提供实现了spring mvc的HttpMessageConverter接口类,引入该jar,将该类注册到Spring中;

方法3:参考自定义数据解析器GSONHttpMessageConverte,自己为MedaiType=application/pdf编写自定义解析器;

方法1:使用Spring MVC框架提供支持

方法1,在这里单独列出来,主要是目的就是带着大家走一下想法,如果Spring框架中本身有的功能能满足我们需求,那就直接使用就好了,只有当没有或者无法满足的时候,我们自己创造轮子吧。

查看现有引入的Spring框架jar包中,所有的实现了HttpMessageConverter接口的派生类,查看源码是否有处理解析MedaiType=application/pdf的数据解析器。(之前我们都找过了,这里我还是在列出来一次吧。)

这里写图片描述

我也是闲着没事,就顺便把所有的Converter可实例化的子类都看了一遍,发现确实没有!不过有比较像的,下面我直接列出来。

org.springframework.http.converter.ResourceHttpMessageConverter

package org.springframework.http.converter;

...省略...

public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter<Resource> {

    ...省略...

    public ResourceHttpMessageConverter() {
        super(MediaType.ALL);
        //构造方法,直接支持了所有的MediaType类型,其中肯定支持MedaiType=application/pdf的。所以看到这个的时候
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return Resource.class.isAssignableFrom(clazz);
        //但是看到这个方法,我又灰心了,该方法是重写了父类方法,名字上分析是是否支持。重写代码逻辑上看应该对解析数据对象有类型要求。所以该类也不好使。
    }

    ...省略...    

}



工程内的所有实现了HttpMessageConverter接口的派生类我都看了,木有找到支持的,没办法只能去网上继续找了,看看spring框架下那些我没有引入的jar中是否存在(http://mvnrepository.com/ 上面查找)。

结果,很不幸,我也没有找到。哈哈。。。。。就到这里吧。

方法2:使用第三方jar提供的数据解析器

呵呵,请同学们直接看方法3吧,方法2没有什么太大意思。方法3掌握了方法2就不算什么了。

方法3:自定义数据解析器

待续。。。。最近事情比较多。。。

<think>好的,我现在要解决用户提出的问题:在IntelliJ IDEA中无法解析org.springframework:spring-expression:4.2.4.RELEASE,出现Maven依赖错误。首先,我需要回顾用户提供的引用内容,看看是否有相关的线索。 用户引用了四个不同的情况,其中引用[1]提到了直接引入不同版本的Spring依赖,比如spring-core的4.2.8,而spring-context用了5.0.2,可能存在版本不一致的问题。引用[2]指出当使用${spring.version}变量时,如果没有正确声明版本号,会导致依赖无法解析,解决方法是统一版本或添加版本配置。引用[3]提到Spring Cloud版本错误,强调版本统一的重要性。引用[4]则指出权限问题可能导致依赖下载失败。 用户的问题是关于spring-expression的4.2.4.RELEASE无法解析。首先,我应该考虑版本冲突的可能性。检查用户是否在项目中混合使用了不同版本的Spring组件,比如spring-beans和spring-context的版本是否与spring-expression一致。例如,在引用[1]中,用户引入了不同版本的依赖,可能导致冲突。 接下来,用户可能在pom.xml中使用了变量来定义版本号,但没有正确声明,如引用[2]所述。需要检查pom.xml中是否有<properties>部分定义了spring.version或者其他相关属性,并确保其正确性。 另外,可能的问题包括Maven仓库中没有该特定版本的依赖,或者网络问题导致无法下载。需要确认4.2.4.RELEASE是否存在于Maven中央仓库,或者用户是否配置了正确的仓库镜像。同时,检查是否有权限问题,如引用[4]提到的AccessDeniedException,但这种情况通常会有不同的错误提示。 此外,IDEA的缓存可能导致依赖解析问题,需要建议用户清理缓存并重新导入项目。还有可能是Maven配置问题,比如settings.xml中的代理或镜像设置不正确。 最后,用户可能需要更新依赖版本,因为4.2.4.RELEASE较旧,可能存在兼容性问题或已被移除。如果必须使用该版本,需要确保所有相关组件的版本一致,如引用[1]和[2]中提到的版本统一建议。 总结解决步骤:检查版本一致性,确认pom.xml中的属性配置,清理IDEA缓存,检查仓库配置,手动安装依赖或更新版本。</think>### 在IDEA中解决`Cannot resolve org.springframework:spring-expression:4.2.4.RELEASE`的完整方案 --- #### 一、核心问题定位 1. **版本不一致** 根据引用[1][^1],若项目中存在**混合版本**的Spring依赖(如`spring-core:4.2.8`和`spring-context:5.0.2`),会导致依赖树冲突。 ```xml <!-- 错误示例:混合版本导致依赖冲突 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.2.4.RELEASE</version> <!-- 低版本 --> </dependency> ``` 2. **版本变量未声明** 参考引用[2][^2],若使用`${spring.version}`但未在`<properties>`中定义,Maven无法解析: ```xml <!-- 错误示例:未声明版本变量 --> <properties> <!-- 缺少 spring.version 声明 --> </properties> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> <!-- 报错 --> </dependency> ``` 3. **仓库镜像/网络问题** - Maven中央仓库可能未托管旧版本(如4.2.4.RELEASE- 本地仓库缓存损坏(引用[4][^4]权限问题可能导致下载失败) --- #### 二、分步解决方案 **方案1:统一Spring版本(推荐)** ```xml <!-- 正确配置:在<properties>中统一定义版本 --> <properties> <spring.version>4.2.8.RELEASE</spring.version> <!--spring-core版本对齐 --> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <!-- 其他Spring组件需同步版本 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> ``` **方案2:强制指定仓库源** 1. 在`pom.xml`中添加阿里云镜像: ```xml <repositories> <repository> <id>aliyun</id> <url>https://maven.aliyun.com/repository/public</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> ``` **方案3:手动清理与刷新** 1. **清理IDEA缓存**: - 点击菜单栏 `File > Invalidate Caches... > Invalidate and Restart` 2. **删除本地Maven仓库中的残留文件**: ```bash # 定位到本地仓库路径 cd ~/.m2/repository/org/springframework/spring-expression rm -rf 4.2.4.RELEASE ``` 3. **重新导入Maven项目**: - 右键点击项目根目录 > `Maven > Reload Project` --- #### 三、特殊场景处理 **场景:必须使用4.2.4.RELEASE** 1. 检查依赖是否真实存在: - 访问[Maven Central仓库](https://repo1.maven.org/maven2/org/springframework/spring-expression/4.2.4.RELEASE/),确认文件列表是否完整 2. 手动安装到本地仓库(若镜像源缺失): ```bash mvn install:install-file -DgroupId=org.springframework \ -DartifactId=spring-expression \ -Dversion=4.2.4.RELEASE \ -Dpackaging=jar \ -Dfile=/path/to/spring-expression-4.2.4.RELEASE.jar ``` --- #### 四、验证配置 1. 在IDEA中打开`Maven工具窗口`: - 检查依赖树是否有冲突:`mvn dependency:tree` - 确认`spring-expression`版本是否统一 ```bash [INFO] org.springframework:spring-expression:jar:4.2.8.RELEASE:compile [INFO] org.springframework:spring-context:jar:4.2.8.RELEASE:compile ``` --- ### 相关问题 1. 如何排查Maven依赖冲突导致的`NoSuchMethodError`? 2. 为什么IDEA有时无法正确解析已存在的本地依赖? 3. 如何为多模块项目统一管理Spring依赖版本? 4. 使用旧版Spring框架时需要注意哪些兼容性问题? [^1]: Spring框架不同组件的版本需严格对齐,否则可能引发类加载冲突或方法缺失异常。 [^2]: Maven属性变量必须先在`<properties>`中声明,否则会导致占位符无法解析。 [^3]: 中央仓库可能移除老旧版本,建议使用LTS版本或企业私有仓库托管特定版本。 [^4]: 权限问题需检查Maven本地仓库目录的读写权限(Windows需以管理员身份运行IDEA)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值