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

Spring Boot+Kotlin调用AWS SNS发短信异常及PublishRequest无builder方法问题

问题原因与解决方案

根本原因

你当前使用的是 AWS SDK for Java 1.x 版本的SNS依赖,PublishRequest.builder() 是AWS SDK for Java 2.x版本新增的API,两个大版本的API互不兼容,所以找不到builder()方法属于正常情况。

你遇到的消息内容重复最后一段的问题,是因为1.x版本的PublishRequest默认没有配置短信编码、短信类型等属性,发送包含越南语等Unicode字符的非GSM编码内容时,SNS自动编码拆分出现异常导致。

解决方案1:继续使用1.x版本(无需改依赖)

不用找builder()方法,直接在原有构造逻辑中补充短信相关的消息属性即可解决内容重复问题,修正后的代码如下:

@Bean
fun snsClient(): AmazonSNS {
    val credentials = BasicAWSCredentials(accessKey, secretKey)
    return AmazonSNSClient.builder()
        .withRegion(Regions.AP_SOUTHEAST_1)
        .withCredentials(AWSStaticCredentialsProvider(credentials))
        .build()
}

private fun sendMsg(snsClient: AmazonSNS, msg: String, phoneNumber: String) {
    try {
        val req = PublishRequest()
        req.message = msg
        req.phoneNumber = phoneNumber
        // 配置短信类型为事务短信,优先级更高、编码更稳定
        req.addMessageAttribute(
            "AWS.SNS.SMS.SMSType",
            MessageAttributeValue()
                .withStringValue("Transactional")
                .withDataType("String")
        )
        // 可选:如果有申请SenderID可以配置,提升送达率
        // req.addMessageAttribute(
        //     "AWS.SNS.SMS.SenderID",
        //     MessageAttributeValue()
        //         .withStringValue("你的SenderID")
        //         .withDataType("String")
        // )

        val res = snsClient.publish(req)
        println(res.sdkResponseMetadata)
    } catch (e: AmazonSNSException) {
        e.printStackTrace()
    }
}

解决方案2:切换到2.x版本使用builder()方法

如果要使用builder()构造请求,需要将项目中的SNS依赖替换为AWS SDK for Java 2.x版本,2.x版本对应的实现代码如下:

// 2.x版本SnsClient构造
@Bean
fun snsClient(): SnsClient {
    val credentials = StaticCredentialsProvider.create(
        AwsBasicCredentials.create(accessKey, secretKey)
    )
    return SnsClient.builder()
        .region(Region.AP_SOUTHEAST_1)
        .credentialsProvider(credentials)
        .build()
}

// 2.x版本发送短信逻辑
private fun sendMsg(snsClient: SnsClient, msg: String, phoneNumber: String) {
    try {
        val request = PublishRequest.builder()
            .message(msg)
            .phoneNumber(phoneNumber)
            .messageAttributes(mapOf(
                "AWS.SNS.SMS.SMSType" to MessageAttributeValue.builder()
                    .stringValue("Transactional")
                    .dataType("String")
                    .build()
            ))
            .build()
        val res = snsClient.publish(request)
        println(res.responseMetadata())
    } catch (e: SnsException) {
        e.printStackTrace()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:03