SpringBoot配置文件--yaml用法及注意事项

本文详细介绍了SpringBoot中配置文件的yaml用法,包括基本语法、数据类型(字面量、对象、数组)的使用,以及如何通过配置文件给Person类实例赋值。同时提到IDEA中yaml的使用技巧和常见问题解决方法。

SpringBoot配置文件–yaml用法

一.基本语法

  • key: value (ps:key和value之间是必须要有空格的)
  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格 (ps:用idea开发时,用tab好像也没有太大影响)
  • 缩进空格数不重要,只要相同层级元素左对齐即可
  • #表示注释
  • ‘’与“” ,单引号和双引号表示字符串内容分别表示 转义 和不转义

二.数据类型

  • 字面量: 单个的、不可再分的值。如date,boolean,String,number,null
key: value
  • 对象:键值对的集合。如map、hash、set、object
行内写法:
k: {k1: v1,k2: v2,k3: v3}
或用如下写法:
k:
 k1: v1
 k2: v2
 k3: v3
  • 数组:一组按次序排列的值。如array、list、queue
行内写法:
k: [v1,v2,v3]
或用如下写法:
k:
 - v1
 - v2
 - v3

三.示例
以下有一个Person类对象,使用配置文件的方式,给对象赋值。

@ConfigurationProperties(prefix = "person") //让组件同配置文件中的key值为person相绑定
@Component //在容器中创建一个组件
@Data
public class Person {
    private String userName;
    private Boolean boss;
    private Date birth;
    private Integer age;
    private Pet pet;
    private String [] interests;
    private List<String> animal;
    private Map<String,Object>score;
    private Set<Double> salarys;
    private Map<String,List<Pet>>allPets;
}

@Data
public class Pet {
    private String name;
    private Integer age;
}

现在通过yaml文件来配置Person对象的值,yaml配置文件后缀可以用.yaml或者是.yml。

person:
 username: 李四
 boss: false
 birth: 1997/12/9
 age: 25
# 行内写法:
# interest: [羽毛球,游泳]
 interest:
  - 羽毛球
  - 游泳
 animal: [猫猫,狗狗]
 score:
  english: 80
  math: 100
# 行内写法:
# score: {english:80,中文:100}
 salary:
  - 9999
  - 8888
 pet:
  name: 崽崽
  age: 3
 allPets:
  stick:
   - {name:狗二}
   - {name:狗三,age:1}
  health: [{name:兔二,age:5}]

编写测试的Control类,该类是返回配置类实例对象person的值。

@RestController
public class HelloController {
    @Autowired
    private Person person;
    @RequestMapping("/person")
    public Person returnPerson(){
        return person;
    }
}

在网页中输入http://localhost:8080/person,可看到输出内容。
在这里插入图片描述
在测试过程中,可能会报如下ava.nio.charset.MalformedInputException: Input length = 1错误。可能是因为yaml配置文件中语法有问题,或者是中文编码存在问题。解决方法可点击该链接查看

四.Idea使用yaml便利技巧
使用idea编写yaml时,不做任何配置的情况下,yaml文件中只有springboot原生配置才会有提示。自己编写的东西写入yaml时是不会有提示的,且在对应类中会有如下提示:
在这里插入图片描述
我们可以在pom.xml文件中导入以下依赖,添加后要记得重新编译

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

编译成功后,在yaml中编写代码时就会有提示了
在这里插入图片描述
该依赖只是优化编写,对实际运行于业务功能无关。所以将项目打包成jar包时,可以添加如下配置,即不打包该依赖类。
在这里插入图片描述

<think>好的,我现在需要帮用户解决如何仅使用Spring Boot、MyBatis-Plus和Spring Data Elasticsearch将MySQL的st_event表数据同步到Elasticsearch中的问题。首先,我得理清楚整个流程,确保每个步骤都正确无误。 用户提到的三个主要技术栈是Spring Boot、MyBatis-Plus和Spring Data Elasticsearch。我需要确保这三个组件能够协同工作。首先,可能需要配置数据源,包括MySQL和Elasticsearch的连接。然后,定义实体类,确保它们能够映射到数据库表和Elasticsearch的索引。接下来,使用MyBatis-Plus从MySQL读取数据,再通过Spring Data Elasticsearch将数据写入Elasticsearch。 首先,配置部分。用户需要添加相关的依赖,比如MyBatis-Plus和Spring Data Elasticsearch的starter。这里要注意版本兼容性,因为Spring Boot和Elasticsearch的版本需要对应,否则可能会出现兼容问题。比如,如果用户用的是较新的Spring Boot版本,可能需要调整Elasticsearch的客户端版本。 然后,实体类的定义。用户需要为st_event表创建对应的实体类,同时使用JPA注解来标注Elasticsearch的索引信息。例如,使用@Document注解指定索引名称,@Id标注主键。这里需要确保MySQL中的字段和Elasticsearch的字段正确映射,可能需要使用@Field注解来调整类型或其他属性。 接下来是数据访问层的配置。MyBatis-Plus需要一个Mapper接口来操作数据库,而Spring Data Elasticsearch则需要一个Repository接口来操作Elasticsearch。用户需要创建这两个接口,并确保它们能够正确注入到服务层中。 在服务层的实现中,可能需要编写一个定时任务或者手动触发的方法,从MySQL中批量读取数据,然后保存到Elasticsearch。这里需要考虑分页查询,避免一次性加载过多数据导致内存溢出。MyBatis-Plus的分页插件可以在这里派上用场,通过分页逐批处理数据。 另外,事务管理可能也是一个需要注意的点,虽然在这个场景中,由于是数据同步,可能不需要复杂的事务控制,但还是要确保数据的一致性和错误处理。比如,如果在同步过程中某条数据失败,是否需要回滚或者记录日志。 还有配置文件的设置,比如application.yml中需要配置MySQL的数据源和Elasticsearch的连接信息。特别是Elasticsearch的host和port,可能需要根据实际环境进行调整。 测试环节也很重要。用户需要验证数据是否正确地被读取并写入到Elasticsearch中。可以通过检查Elasticsearch的索引是否存在,或者查询特定数据来确认同步是否成功。 可能遇到的问题包括依赖冲突、字段映射不一致、版本不兼容等。例如,Spring Data Elasticsearch默认可能使用TransportClient,但新版本中已经弃用,改用RestHighLevelClient,这时候需要检查配置是否正确。另外,实体类中的字段类型如果和Elasticsearch的映射不匹配,可能会导致写入失败,需要仔细检查注解配置。 最后,用户可能需要考虑增量同步的问题,即如何检测MySQL中新增或修改的数据,并同步到Elasticsearch。这可以通过在表中添加更新时间戳字段,或者使用数据库的binlog监听来实现。不过根据用户当前的要求,可能只需要全量同步,所以可以先实现全量同步,再考虑增量部分。 总结一下,步骤大致是:配置依赖和连接信息→创建实体类→实现数据访问层→编写同步逻辑→测试验证。需要确保每个环节的代码正确,并且处理可能出现的异常情况。</think>根据您的要求,这里提供使用Spring Boot + MyBatis-Plus + Spring Data Elasticsearch实现MySQL到Elasticsearch数据同步的完整解决方案: ### 一、基础配置步骤 1. **添加依赖**(pom.xml): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> ``` 2. **配置文件**(application.yml): ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/your_db username: root password: root elasticsearch: uris: http://localhost:9200 ``` ### 二、实体类映射 ```java // MySQL实体类 @TableName("st_event") public class StEvent { @TableId(type = IdType.AUTO) private Long id; private String eventName; private LocalDateTime eventTime; // getters/setters } // Elasticsearch实体类 @Document(indexName = "st_event_index") public class EsStEvent { @Id private String id; @Field(type = FieldType.Text) private String eventName; @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second) private LocalDateTime eventTime; // getters/setters } ``` ### 三、数据访问层 ```java // MySQL操作接口 public interface StEventMapper extends BaseMapper<StEvent> { } // ES操作接口 public interface EsStEventRepository extends ElasticsearchRepository<EsStEvent, String> { } ``` ### 四、核心同步服务 ```java @Service @RequiredArgsConstructor public class SyncService { private final StEventMapper stEventMapper; private final EsStEventRepository esRepository; @Scheduled(fixedRate = 60000) // 每分钟同步一次 public void syncData() { List<StEvent> mysqlData = stEventMapper.selectList(new QueryWrapper<>()); List<EsStEvent> esData = mysqlData.stream() .map(item -> new EsStEvent( item.getId().toString(), item.getEventName(), item.getEventTime() )).collect(Collectors.toList()); esRepository.saveAll(esData); } } ``` ### 五、增强功能建议 1. **增量同步优化**: ```java QueryWrapper<StEvent> wrapper = new QueryWrapper<>(); wrapper.gt("update_time", lastSyncTime); ``` 2. **批量处理优化**: ```java // 分页批量处理 int pageSize = 1000; Page<StEvent> page = new Page<>(1, pageSize); while (true) { IPage<StEvent> result = stEventMapper.selectPage(page, null); // 转换并保存 if (!result.hasNext()) break; page = new Page<>(page.getCurrent() + 1, pageSize); } ``` ### 六、注意事项 1. **版本兼容性**:确保Spring Boot版本与Elasticsearch服务器版本匹配,推荐使用以下组合: - Spring Boot 2.7.x → Elasticsearch 7.17.x - Spring Boot 3.0.x → Elasticsearch 8.5.x[^1] 2. **字段类型映射**:建议在ES实体类中显式声明`@Field`类型,避免自动推断导致类型不一致 3. **事务管理**:建议添加`@Transactional`注解保证数据一致性
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值