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

引入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:30:38