升级SpringBoot 3.2.1后SendinBlue API出现Bean创建异常问题
问题:SpringBoot 3.2.1升级后SendinBlue API抛出NoSuchFieldError异常
将SpringBoot从v3.1.2升级至v3.2.1后,SendinBlue API出现异常,具体报错栈如下:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mailSenderProvider': Invocation of init method failed ... Caused by: java.lang.NoSuchFieldError: Class okio.Options does not have member field 'okio.Options$Companion Companion' at okhttp3.internal.Util.<clinit>(Util.kt:70) ~[okhttp-4.12.0.jar:na] at okhttp3.OkHttpClient.<clinit>(OkHttpClient.kt:1073) ~[okhttp-4.12.0.jar:na] at sendinblue.ApiClient.<init>(ApiClient.java:80) ~[sib-api-v3-sdk-7.0.0.jar:na] at sendinblue.Configuration.<clinit>(Configuration.java:18) ~[sib-api-v3-sdk-7.0.0.jar:na]
相关配置与代码如下:
依赖配置
<dependency> <groupId>com.sendinblue</groupId> <artifactId>sib-api-v3-sdk</artifactId> <version>7.0.0</version> <scope>compile</scope> </dependency>
MailSenderProvider.java代码
// MailSenderProvider.java import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import sendinblue.ApiClient; import sendinblue.auth.ApiKeyAuth; import sibApi.ContactsApi; import sibApi.TransactionalEmailsApi; @Configuration @RequiredArgsConstructor public class MailSenderProvider { private final MailConfiguration mailConfiguration; @PostConstruct private void initialize() { ApiClient defaultClient = sendinblue.Configuration.getDefaultApiClient(); ApiKeyAuth apiKeyAuth = (ApiKeyAuth) defaultClient.getAuthentication("api-key"); apiKeyAuth.setApiKey(mailConfiguration.getApiKey()); } @Bean public TransactionalEmailsApi transactionalEmailsApi() { return new TransactionalEmailsApi(); } @Bean public ContactsApi contactsApi() { return new ContactsApi(); } }
MailServiceImpl.java代码
// MailService import sendinblue.ApiException; import sibApi.TransactionalEmailsApi; import sibModel.SendSmtpEmail; import sibModel.SendSmtpEmailSender; import sibModel.SendSmtpEmailTo; @Service @RequiredArgsConstructor @Slf4j @EnableAsync public class MailServiceImpl implements MailService { private final MailConfiguration mailConfiguration; private final TransactionalEmailsApi transactionalEmailsApi; private SendSmtpEmailSender noReplyEmail; private SendSmtpEmailTo contactEmail; @PostConstruct private void init() { noReplyEmail = new SendSmtpEmailSender().email(mailConfiguration.getEmail().getNoreply()).name(mailConfiguration.getName()); contactEmail = new SendSmtpEmailTo().email(mailConfiguration.getEmail().getContact()).name(mailConfiguration.getName()); } @Override @Async public CompletableFuture<Void> sendRegistrationEMail(String name, String email, String registrationToken, String url) { Properties headers = new Properties(); headers.setProperty("Content-Type", "text/html; charset=UTF-8"); Properties params = new Properties(); params.setProperty("token", registrationToken); params.setProperty("name", name); params.setProperty("url", url + "/account/confirm?token=" + registrationToken); SendSmtpEmail sendSmtpEmail = new SendSmtpEmail() .sender(noReplyEmail) .addToItem(new SendSmtpEmailTo().email(email)) .subject("Votre Compte ...") .headers(headers) .params(params) .templateId(mailConfiguration.getTemplate().getRegistrationMail()); try { transactionalEmailsApi.sendTransacEmail(sendSmtpEmail); } catch (ApiException e) { log.error(e.getResponseBody()); } return new CompletableFuture<>(); } }
解决方案
这个报错是OkHttp与Okio版本不兼容导致的:SpringBoot 3.2.x升级后默认引入的Okio版本(3.x+)与SendinBlue SDK 7.0.0依赖的OkHttp 4.12.0不匹配——OkHttp 4.12.0依赖的是Okio 3.0.x之前的版本,而Okio 3.x重构了Options类,移除了Companion字段,导致反射调用失败。
解决步骤:
升级SendinBlue SDK版本
SendinBlue SDK 8.0.0及以上版本已经适配了OkHttp 4.1.x+和Okio 3.x,直接升级依赖版本即可:<dependency> <groupId>com.sendinblue</groupId> <artifactId>sib-api-v3-sdk</artifactId> <version>8.1.0</version> <!-- 或最新稳定版 --> <scope>compile</scope> </dependency>强制指定Okio版本(备选方案)
如果暂时无法升级SDK,可以在pom.xml中强制指定兼容的Okio版本(比如2.10.0),覆盖SpringBoot默认引入的版本:<dependencyManagement> <dependencies> <dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>2.10.0</version> </dependency> </dependencies> </dependencyManagement>验证依赖树
执行mvn dependency:tree命令,检查OkHttp和Okio的版本是否一致且兼容,确保没有冲突的依赖版本被引入。
内容的提问来源于stack exchange,提问作者Smaillns
相关产品推荐
相关产品推荐

