Spring Boot部署Tomcat后调用WebService报JSON解析400错误求助
这个问题我之前碰到过类似的,核心其实是你部署到Tomcat后,请求WebService拿到的响应根本不是JSON,而是HTML或者XML(比如Tomcat的错误页面、WebService默认返回的XML格式),所以Jackson解析时碰到<字符直接报错了。咱们一步步来排查解决:
别光盯着错误日志,先把请求返回的真实内容打出来看看。你可以临时修改代码,用RestTemplate直接获取字符串类型的响应:
String rawResponse = restTemplate.getForObject(yourWebServiceUrl, String.class); System.out.println("WebService返回的原始内容:\n" + rawResponse);
大概率你会看到Tomcat的400错误页面源码(带<html>标签),或者WebService返回的SOAP XML(带<soap:Envelope>这类标签),这就能直接定位问题方向。
独立类能正常运行,很大可能是你在里面设置了正确的请求头,但Spring Boot项目里漏掉了:
- 最常见的是
Accept: application/json头:如果没加这个,WebService可能默认返回XML格式,自然会触发JSON解析错误。 - 检查认证头是否正确传递:比如Basic Auth、Bearer Token这类认证信息,是不是在Spring Boot的RestTemplate配置里没加上?Tomcat的安全配置会不会拦截或修改了请求头?
如果你的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格式。
独立类里的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(); }
如果WebService需要认证,要排查Spring Boot部署到Tomcat后,认证信息是否正确加载:
- 比如你在独立类里硬编码了认证信息,但Spring Boot里是从配置文件读取,而war包部署后配置文件路径不对,导致认证失败,WebService返回401的HTML错误页面。
- 检查Tomcat的全局安全配置,有没有和你的WebService认证冲突的地方。
内容的提问来源于stack exchange,提问作者user7220859




