实现移动端通用链接时,如何解决Spring 3.0 MVC'mediaType'非空错误?
解决Spring 3.0 MVC中处理Apple App Site Association时的'mediaType'不能为空错误
我之前在维护Spring 3.x项目对接Apple通用链接时,刚好碰到过一模一样的问题!这个错误的核心原因很简单:apple-app-site-association文件没有文件后缀,Spring MVC默认无法识别它对应的媒体类型(mediaType),导致处理请求时抛出必填项为空的异常。
下面给你几个经过验证的解决方案,你可以根据自己的项目情况选择:
方案一:在Spring MVC配置中直接指定媒体类型
这是最直接的方式,告诉Spring这个无后缀文件属于JSON类型:
如果是XML配置(Spring 3.0常用方式)
在你的spring-servlet.xml或者Web MVC配置文件里添加以下配置:
<!-- 先配置资源映射,确保能访问到.well-known目录下的文件 --> <mvc:resources mapping="/.well-known/**" location="/.well-known/" /> <!-- 为apple-app-site-association指定JSON媒体类型 --> <mvc:annotation-driven> <mvc:media-types> <mvc:media-type type="application/json" file-name-pattern="apple-app-site-association"/> </mvc:media-types> </mvc:annotation-driven>
如果是Java配置(Spring 3.0支持JavaConfig的话)
创建一个Web配置类,继承WebMvcConfigurerAdapter:
@Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { // 为无后缀文件指定媒体类型 @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.mediaType("apple-app-site-association", MediaType.APPLICATION_JSON); } // 配置资源处理器,允许访问.well-known目录 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/.well-known/**") .addResourceLocations("/.well-known/"); } }
方案二:重命名文件+URL重写
如果不想修改Spring配置,可以把apple-app-site-association重命名为apple-app-site-association.json,然后通过服务器的URL重写规则,把原请求路径转发到带后缀的文件:
Tomcat的重写规则
在conf/Catalina/localhost/[你的应用名].xml或者项目的WEB-INF/web.xml里添加重写配置:
<Context> <Rewrite> <Rule> <From>^/.well-known/apple-app-site-association$</From> <To>/apple-app-site-association.json</To> </Rule> </Rewrite> </Context>
Apache服务器的mod_rewrite规则
在.htaccess文件里添加:
RewriteEngine On RewriteRule ^/.well-known/apple-app-site-association$ /.well-known/apple-app-site-association.json [L]
方案三:用Controller直接返回内容
如果上述方法都不适合,你可以写一个简单的Controller,手动返回apple-app-site-association的JSON内容,并明确指定媒体类型:
@Controller public class AppleAppLinkController { @RequestMapping( value = "/.well-known/apple-app-site-association", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE ) @ResponseBody public String getAppleAppSiteAssociation() { // 这里可以直接返回JSON字符串,或者读取文件内容返回 return "{\"applinks\": {\"apps\": [], \"details\": [{\"appID\": \"你的TeamID.你的BundleID\", \"paths\": [\"*\"]}]}}"; } }
额外注意事项
- 确保
apple-app-site-association的内容是合法的JSON格式,不要有语法错误,否则Apple验证会失败 - 生产环境必须使用HTTPS协议,Apple的通用链接要求请求必须是HTTPS(localhost测试可以例外)
- 检查Spring 3.0的版本兼容性,比如
WebMvcConfigurerAdapter在3.0是可用的,但部分方法可能和后续版本略有差异
内容的提问来源于stack exchange,提问作者Jayakumar Devaraj
相关产品推荐
相关产品推荐

