关于java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 类似问题的解决总结

本文介绍了解决Spring框架中DAO支持类使用时遇到的java.lang.IllegalArgumentException异常的方法。通过两种方式——XML配置和注解——详细解释如何正确地将jdbcTemplate注入到继承自JdbcDaoSupport的子类中。

关于java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required 类似问题的解决总结

 本文属原创,转载请注明出处。   

 这一类问题容易出现在应用Spring内置的一些DAO支持类的时候发生。

比如一个类需要继承 JdbcDaoSupport 这个类。

public  class SearchProductLuceneDAO  extends JdbcDaoSupport {

}

 使用Spring中DAO支持类的时候,需要在Spring的配置文件中定义一个bean,具体有需要使用的bean来决定,我使用的是JdbcTemplate。所以配置为:

 

< bean  id ="jdbcTemplate"
      class
="org.springframework.jdbc.core.JdbcTemplate" >
    < constructor-arg  ref ="dataSource"   />

</bean>

这个类的使用需要一个dataSource,一般都是配置好的,引用到这里就行了。

好了,到这里基本完成了,还剩最后一步,那就是注入。

打开 JdbcDaoSupport 的源代码会发现,此类中需要一个 jdbcTemplate。仔细看了源码会发现,注入一个dataSource也是可以的。那么现在的问题是怎么注入?

两种方法,一种是xml配置这个DAO,将jdbcTemplate这个bean注入进去。可是可能会出现疑惑,因为这个需要注入的属性 jdbcTemplate 是在父类中的属性,子类里面没有啊,怎么注入啊。一想,父类有不就等于子类有吗?仔细一看,还是不对,因为这个属性在父类中是私有的,子类没有这个属性。

分析一下Spring的注入,它是根据Set方法来注入的,父类有jdbcTemplate属性,私有的,但是有公用的get和set方法,那么想当与子类也有了这两个方法,好了,思路清晰了。

直接配置就行了:

  < bean  id ="productSearchDAO"  class ="cn.com.leon.manager.search.dao.SearchProductLuceneDAO" >
           < property  name ="jdbcTemplate"  ref ="jdbcTemplate" ></ property >
  </ bean >

 这样就直接将jdbcTemplate注入进去了,是根据父类的set方法注入的,与属性无关,所说义SearchProductLucene只用集成JdbcDaoSupport,别得什么都不用,直接用

 

getJdbcTemplate ()方法进行使用就行了。

第二种就是注解的方式。怎样使用注解把jdbcTemplate注入到父类去呢?

根据刚才的分析,也很简单。既然是根据set方法进行注入的,那就先注入到子类,再利用父类的set方法注入进去。

也不用在子类中申明什么变量,就直接利用set方法:

@Resource
public  void setJb(JdbcTemplate jb) {
  super.setJdbcTemplate(jb);
    }

 这里只要用super的set方法将注入给子类的JdbcTemplate传入父类就行了。不用配置Spring配置文件,但是JdbcTemplate还是要在Spring配置文件中申明的。


org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'studentController': Unsatisfied dependency expressed through field 'studentService': Error creating bean with name 'studentServiceImpl': Unsatisfied dependency expressed through field 'studentDao': Error creating bean with name 'studentDaoIml': Unsatisfied dependency expressed through field 'jdbcTemplate': Error creating bean with name 'jdbcTemplate' defined in class path resource [annotation01.xml]: Property 'dataSource' is required at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:712) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:692) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:481) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1408) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:961) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85) at annotationTest.test01(annotationTest.java:11) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'studentServiceImpl': Unsatisfied dependency expressed through field 'studentDao': Error creating bean with name 'studentDaoIml': Unsatisfied dependency expressed through field 'jdbcTemplate': Error creating bean with name 'jdbcTemplate' defined in class path resource [annotation01.xml]: Property 'dataSource' is required at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:712) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:692) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:481) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1408) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1405) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:709) ... 43 more Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'studentDaoIml': Unsatisfied dependency expressed through field 'jdbcTemplate': Error creating bean with name 'jdbcTemplate' defined in class path resource [annotation01.xml]: Property 'dataSource' is required at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:712) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:692) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:133) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:481) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1408) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1405) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:709) ... 57 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in class path resource [annotation01.xml]: Property 'dataSource' is required at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1405) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1325) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:709) ... 71 more Caused by: java.lang.IllegalArgumentException: Property 'dataSource' is required at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(JdbcAccessor.java:165) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1808) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1758) ... 81 more
最新发布
09-21
<think>我们遇到了一个IllegalArgumentException,提示信息是"dataSource or dataSourceClassName or jdbcUrl is required."。这个错误通常发生在配置数据源时,没有提供足够的信息来创建数据源。在Spring Boot中,当我们使用DataSourceBuilder创建数据源时,必须至少提供以下信息之一: - 一个已存在的数据源(DataSource)实例 - 数据源类名(dataSourceClassName) - JDBC URL(jdbcUrl) 这个错误表明,我们在配置数据源时,没有正确设置这些属性。下面我们将详细分析并解决这个问题。 ### 错误原因分析 1. **配置属性缺失**:在application.yml(或application.properties)中,可能没有正确设置数据源的相关属性,特别是`url`(或`jdbc-url`)、`username`、`password`等。 2. **配置前缀错误**:在通过`@ConfigurationProperties`绑定属性时,前缀配置错误,导致属性没有正确绑定到数据源配置上。 3. **依赖缺失**:可能缺少数据库驱动依赖,导致无法识别数据源配置。 4. **环境变量覆盖**:环境变量可能覆盖了配置文件中的属性,导致配置不生效。 ### 解决方案 #### 1. 检查并修复数据源配置 确保在`application.yml`中正确配置了数据源。例如,对于MySQL数据源: ```yaml spring: datasource: # 主数据源配置 master: url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver ``` 注意:在Spring Boot 2.x中,通常使用`url`而不是`jdbc-url`。但如果你使用的是某些连接池(如HikariCP),它也可以识别`jdbcUrl`属性。确保属性名正确。 #### 2. 检查数据源配置类 在数据源配置类中,确保使用`@ConfigurationProperties`注解并指定正确的前缀。例如: ```java @Bean @ConfigurationProperties(prefix = "spring.datasource.master") // 确保前缀与配置文件中的一致 public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } ``` #### 3. 添加数据库驱动依赖 在pom.xml中确保有对应的数据库驱动,例如MySQL: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> <!-- 使用适合的版本 --> </dependency> ``` #### 4. 检查环境变量 如果使用环境变量,确保没有覆盖数据源配置。例如,检查是否设置了`SPRING_DATASOURCE_MASTER_URL`等环境变量,并且其值正确。 #### 5. 使用完整的配置属性 如果问题仍然存在,可以尝试在配置中明确指定数据源类名(dataSourceClassName)或JDBC URL(jdbcUrl)。例如: ```yaml spring: datasource: master: jdbc-url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver ``` 注意:在某些连接池(如HikariCP)中,`url`属性可能需要写成`jdbc-url`,因为`url`属性可能会被其他配置占用。 ### 完整示例代码 以下是一个完整的数据源配置类: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } // 如果有多个数据源,可以继续配置其他数据源 } ``` ### 常见问题排查步骤 1. **检查配置文件的名称和位置**:确保配置文件(application.yml或application.properties)位于src/main/resources目录下,且名称正确。 2. **检查配置属性拼写**:注意属性名的大小写和拼写,比如`url`、`username`、`password`等。 3. **检查配置是否生效**:可以在配置类中打印数据源属性,验证配置是否被正确加载。 4. **查看依赖树**:使用`mvn dependency:tree`命令检查是否有冲突的依赖,特别是不同版本的数据库驱动。 ### 示例:打印数据源配置 为了验证数据源配置是否正确加载,可以在创建数据源后打印其属性: ```java @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { DataSource dataSource = DataSourceBuilder.create().build(); System.out.println("DataSource URL: " + dataSource.getConnection().getMetaData().getURL()); return dataSource; } ``` 注意:上述打印方法需要处理SQLException,实际使用中建议使用日志记录,并在调试后移除。 ### 总结 出现"dataSource or dataSourceClassName or jdbcUrl is required"错误,主要是因为数据源配置信息不完整或未正确加载。通过检查配置文件、配置类、依赖和环境变量,通常可以解决这个问题。 §§相关问题§§ 1.Spring Boot中配置数据源时,如何解决"dataSource or dataSourceClassName or jdbcUrl is required"错误? 2. 使用DataSourceBuilder创建数据源需要哪些必要的配置属性? 3.Spring Boot中如何正确配置多数据源? 4. 如何检查Spring Boot应用程序中的数据源配置是否正确加载? 5. 使用HikariCP连接池时,数据源配置有哪些注意事项?</think>### 问题分析与解决方案 这个错误 `java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required` 表明数据源配置缺少必要参数。以下是完整的解决方案: #### 1. **检查并修复 YAML 配置** 确保在 `application.yml` 中正确配置了数据源参数: ```yaml spring: datasource: # 必须包含以下至少一个参数 url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver # 或者使用 HikariCP 的显式配置 hikari: jdbc-url: jdbc:mysql://localhost:3306/your_db username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 2. **检查配置类中的属性绑定** 确保 `@ConfigurationProperties` 前缀与配置匹配: ```java @Bean @ConfigurationProperties(prefix = "spring.datasource") // 确保前缀正确 public DataSource dataSource() { return DataSourceBuilder.create().build(); } ``` #### 3. **验证依赖是否正确** 在 `pom.xml` 中确保有数据库驱动依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> ``` #### 4. **检查环境变量覆盖** 确保环境变量没有覆盖配置: ```bash # 检查是否有冲突的环境变量 echo $SPRING_DATASOURCE_URL echo $DATASOURCE_URL ``` #### 5. **使用显式配置替代属性绑定** 如果属性绑定失败,尝试显式配置: ```java @Bean public DataSource dataSource() { HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/your_db"); dataSource.setUsername("your_username"); dataSource.setPassword("your_password"); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); return dataSource; } ``` ### 常见错误排查表 | 错误原因 | 检查点 | 解决方案 | |---------|--------|---------| | 配置缺失 | YAML 中缺少 url/jdbc-url | 添加完整的 JDBC URL | | 属性绑定失败 | `@ConfigurationProperties` 前缀错误 | 确保前缀匹配配置路径 | | 依赖冲突 | 多个连接池依赖 | 排除多余依赖:`exclude HikariCP/Druid` | | 环境变量覆盖 | 系统环境变量设置 | 检查 `SPRING_DATASOURCE_*` 变量 | | 属性名错误 | 使用 `url` 还是 `jdbc-url` | 根据连接池使用正确属性名 | ### 完整配置示例 ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public DataSource dataSource() { return DataSourceBuilder.create() .type(HikariDataSource.class) // 明确指定连接池类型 .build(); } } ``` ```yaml spring: datasource: hikari: jdbc-url: jdbc:mysql://localhost:3306/ry-cloud username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver connection-timeout: 30000 maximum-pool-size: 20 ``` ### 测试数据源配置 ```java @SpringBootTest class DataSourceTest { @Autowired private DataSource dataSource; @Test void testConnection() { try (Connection conn = dataSource.getConnection()) { DatabaseMetaData meta = conn.getMetaData(); System.out.println("Connected to: " + meta.getDatabaseProductName()); System.out.println("JDBC URL: " + meta.getURL()); } catch (SQLException e) { fail("Connection failed: " + e.getMessage()); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值