You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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产生冲突:

  • 检查Tomcatlib目录下是否存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:55:01