Spring RestController部署外部Tomcat时JSON解析报错求助
Spring Boot外部Tomcat部署后JSON接口报Content-Type不支持错误
问题现象
- 使用
spring-boot-starter-web内嵌Tomcat时,所有接口正常工作; - 将主类改为继承
SpringBootServletInitializer部署到同版本外部Tomcat后,testCall接口正常,inputTest接口报错:'Content-Type 'application/json;charset=UTF-8' is not supported'; - 手动设置接口的
consumes/produces参数无效,怀疑与JSON对象映射相关,但无法解释同版本Tomcat的表现差异。
版本信息
- Spring 6.2.1
- Jackson 2.18.2
- Tomcat 10.1.34(内嵌与外部版本一致)
解决方向建议
1. 排查Jackson依赖冲突
外部Tomcat的lib目录可能自带旧版本Jackson或其他JSON处理库,与项目依赖的Jackson 2.18.2产生冲突:
- 检查Tomcat
lib目录下是否存在jackson-*或javax.json-*等jar包,如有则移除; - 在项目
pom.xml中确保Jackson相关依赖完整,可通过<exclusions>排除Spring Boot自动引入的可能冲突依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.18.2</version> </dependency>
2. 手动配置Jackson消息转换器
内嵌与外部Tomcat环境下,Spring MVC消息转换器的初始化逻辑可能存在差异,可手动指定Jackson转换器支持的媒体类型:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2HttpMessageConverter jacksonConverter = new Jackson2HttpMessageConverter(); // 明确指定支持的媒体类型,包含带UTF-8编码的格式 List<MediaType> supportedMediaTypes = new ArrayList<>(); supportedMediaTypes.add(MediaType.APPLICATION_JSON); supportedMediaTypes.add(new MediaType("application", "json", StandardCharsets.UTF_8)); jacksonConverter.setSupportedMediaTypes(supportedMediaTypes); // 将自定义转换器放在最前面,优先使用 converters.add(0, jacksonConverter); } }
3. 检查接口参数绑定有效性
确认inputTest接口的参数绑定逻辑无问题:
- 确保参数类添加了
@RequestBody注解; - 参数类必须有无参构造函数,Jackson需要通过无参构造实例化对象;
- 检查参数类的字段是否添加了正确的Jackson注解(如
@JsonProperty),避免字段映射失败。
4. 验证外部Tomcat的MIME配置
检查外部Tomcatconf/web.xml中的MIME映射,确保application/json配置正确:
<mime-mapping> <extension>json</extension> <mime-type>application/json</mime-type> </mime-mapping>
同时排查是否有自定义Filter拦截请求并修改了Content-Type头。
5. 开启DEBUG日志定位细节
在application.properties中添加日志配置,查看请求处理过程中消息转换器的选择逻辑:
logging.level.org.springframework.web=DEBUG logging.level.com.fasterxml.jackson=DEBUG
通过日志可确认Jackson转换器是否被加载,以及拒绝处理该Content-Type的具体原因。
内容的提问来源于stack exchange,提问作者jfaulk919
相关产品推荐
相关产品推荐

