You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot部署Tomcat后调用WebService报JSON解析400错误求助

这个问题我之前碰到过类似的,核心其实是你部署到Tomcat后,请求WebService拿到的响应根本不是JSON,而是HTML或者XML(比如Tomcat的错误页面、WebService默认返回的XML格式),所以Jackson解析时碰到<字符直接报错了。咱们一步步来排查解决:

1. 先抓出实际的响应内容

别光盯着错误日志,先把请求返回的真实内容打出来看看。你可以临时修改代码,用RestTemplate直接获取字符串类型的响应:

String rawResponse = restTemplate.getForObject(yourWebServiceUrl, String.class);
System.out.println("WebService返回的原始内容:\n" + rawResponse);

大概率你会看到Tomcat的400错误页面源码(带<html>标签),或者WebService返回的SOAP XML(带<soap:Envelope>这类标签),这就能直接定位问题方向。

2. 核对请求头是否和独立运行时一致

独立类能正常运行,很大可能是你在里面设置了正确的请求头,但Spring Boot项目里漏掉了:

  • 最常见的是Accept: application/json头:如果没加这个,WebService可能默认返回XML格式,自然会触发JSON解析错误。
  • 检查认证头是否正确传递:比如Basic Auth、Bearer Token这类认证信息,是不是在Spring Boot的RestTemplate配置里没加上?Tomcat的安全配置会不会拦截或修改了请求头?
3. 排查Tomcat上下文路径导致的URL错误

如果你的Spring Boot项目打包成war后,在Tomcat里的上下文路径(比如/your-war-app)和你独立运行时的根路径不一样,要确认代码里的WebService URL有没有被错误拼接。比如你本来要调用http://xxx.com/webservice,结果代码里不小心加上了项目上下文路径,变成http://your-tomcat/your-war-app/xxx.com/webservice,这时候请求的是Tomcat里不存在的路径,返回404错误页面,自然是HTML格式。

4. 检查RestTemplate的配置差异

独立类里的RestTemplate配置和Spring Boot自动配置的版本可能不一样:

  • 独立类里可能自定义了只支持JSON的消息转换器,而Spring Boot默认的RestTemplate同时支持XML和JSON,导致没有强制WebService返回JSON。
  • 有没有设置错误处理器?比如独立类里忽略了4xx错误,但Spring Boot默认的处理逻辑会把错误响应抛出来,而这些错误响应都是HTML格式的页面。

举个正确配置RestTemplate的例子,确保强制接收JSON并带上认证:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            // 替换成你的认证信息
            .basicAuthentication("your-username", "your-password")
            // 强制要求返回JSON
            .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
            .build();
}
5. 确认认证机制在Tomcat环境下生效

如果WebService需要认证,要排查Spring Boot部署到Tomcat后,认证信息是否正确加载:

  • 比如你在独立类里硬编码了认证信息,但Spring Boot里是从配置文件读取,而war包部署后配置文件路径不对,导致认证失败,WebService返回401的HTML错误页面。
  • 检查Tomcat的全局安全配置,有没有和你的WebService认证冲突的地方。

内容的提问来源于stack exchange,提问作者user7220859

火山引擎 最新活动