引入Twilio依赖后全接口返回XML,如何恢复JSON响应?
问题原因
Twilio Java SDK依赖了**JAXB(Java Architecture for XML Binding)**相关组件,Spring Boot自动配置机制会在检测到JAXB类存在时,自动注册XML消息转换器,并且会将XML作为优先的响应格式——尤其是你的接口返回ResponseEntity<String>这种泛型类型、没有明确指定响应媒体类型时,就会触发这个问题。
解决方案
可以通过以下几种方式恢复JSON响应:
1. 全局配置优先使用JSON
在Spring Boot配置类中,显式调整消息转换器的优先级,让JSON转换器优先于XML转换器:
import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 移除XML转换器,或调整顺序让JSON排在最前面 converters.removeIf(converter -> converter instanceof Jaxb2RootElementHttpMessageConverter); converters.add(0, new MappingJackson2HttpMessageConverter()); } }
2. 单个接口指定响应媒体类型
在Controller的@RequestMapping中添加produces属性,明确指定返回JSON格式:
import org.springframework.http.MediaType; // ... @RequestMapping(value = "/sendmessage", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<String> sendmessage(@RequestBody UserDto userDto) { return userRegisterService.sendmessage(userDto.getMobileNumber(), userDto.getSmsMessage()); }
3. 排除Twilio依赖中的JAXB组件
如果不需要XML相关功能,可以直接在依赖管理中排除Twilio带的JAXB组件:
Maven配置示例
<dependency> <groupId>com.twilio.sdk</groupId> <artifactId>twilio</artifactId> <version>你的Twilio版本号</version> <exclusions> <exclusion> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> </exclusion> <exclusion> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> </exclusion> </exclusions> </dependency>
Gradle配置示例
implementation('com.twilio.sdk:twilio:你的Twilio版本号') { exclude group: 'javax.xml.bind', module: 'jaxb-api' exclude group: 'com.sun.xml.bind', module: 'jaxb-core' exclude group: 'com.sun.xml.bind', module: 'jaxb-impl' }
4. 修改返回类型为JSON结构
将返回的字符串包装成POJO类,让Spring明确以JSON格式序列化:
// 定义统一响应类 public class ApiResponse { private String message; public ApiResponse(String message) { this.message = message; } // Getter和Setter public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
然后修改Service和Controller的返回类型:
// Service类 public ResponseEntity<ApiResponse> sendmessage(String mobileNumber, String smsMessage) { Message.creator(new PhoneNumber(mobileNumber), new PhoneNumber(OUTGOINGSMSNumber), smsMessage).create(); return new ResponseEntity<>(new ApiResponse("Message sent successfully"), HttpStatus.OK); } // Controller类 @RequestMapping(value = "/sendmessage", method = RequestMethod.POST) public ResponseEntity<ApiResponse> sendmessage(@RequestBody UserDto userDto) { return userRegisterService.sendmessage(userDto.getMobileNumber(), userDto.getSmsMessage()); }
这样Spring会默认使用JSON序列化返回结果,避免触发XML转换器。
内容的提问来源于stack exchange,提问作者SUPRIYA Upadhyay
相关产品推荐
相关产品推荐

