lombok.config文件的位置规则

lombok.config 文件的位置规则

Lombok 的配置文件 lombok.config 可以放置在多个位置,Lombok 会按照特定顺序查找并合并这些配置。以下是关于文件位置的详细说明:

1. 标准位置

项目根目录(推荐)

/your-project-root/lombok.config
  • 这是最常用的位置,适用于整个项目
  • Maven/Gradle 项目的根目录(与 pom.xmlbuild.gradle 同级)

源代码目录

/your-project-root/src/main/java/lombok.config
/your-project-root/src/test/java/lombok.config
  • 只影响对应源代码目录下的文件
  • 测试目录的配置会覆盖主代码目录的配置

包目录

/your-project-root/src/main/java/com/yourpackage/lombok.config
  • 只影响该包及其子包中的类
  • 包级配置会覆盖全局配置

2. 查找顺序

Lombok 按以下顺序查找配置(后面的配置会覆盖前面的):

  1. Lombok 自带的默认配置(内部)
  2. 项目根目录的 lombok.config
  3. 源代码目录(src/main/javasrc/test/java)的 lombok.config
  4. 包目录中的 lombok.config

3. 验证配置是否生效

可以通过以下方式验证:

  1. 在命令行运行:

    java -jar lombok.jar config --show
    
  2. 查看编译后的代码,确认 Lombok 生成的元素是否应用了配置

4. 配置示例

典型的 lombok.config 内容示例:

# 将Jackson注解复制到生成的方法上
lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty

# 启用实验性功能
lombok.experimental.flagUsage = WARNING

# 禁用某些警告
lombok.log.fieldIsStatic = false

5. 注意事项

  1. 文件名必须精确:只能是 lombok.config(不能是 lombok-config.conf 等变体)
  2. 编码建议:使用 UTF-8 编码
  3. IDE 支持
    • IntelliJ IDEA 需要安装 Lombok 插件
    • Eclipse 需要正确配置 Lombok 代理
  4. 构建工具集成
    • Maven/Gradle 项目通常放在项目根目录
    • 确保文件被包含在最终构建中(通常不需要特别处理)

6. 特殊场景

多模块项目

对于 Maven/Gradle 多模块项目:

  • 每个子模块可以有独立的 lombok.config
  • 子模块配置会覆盖父模块配置

测试专用配置

src/test/java/lombok.config 中的配置只影响测试代码

通过合理放置 lombok.config 文件,你可以实现不同层次的配置覆盖,满足项目不同部分的差异化需求。

package com.luxsan.llm.ai.service.impl; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.luxsan.llm.ai.domain.ValidationResult; import lombok.RequiredArgsConstructor; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @RequiredArgsConstructor @Service public class PdfJsonCompareService { private final Map<String, Pattern> patternCache = new ConcurrentHashMap<>(); /** * 读取PDF文本 / public String readPdfText(MultipartFile file) throws IOException { PDDocument doc = PDDocument.load(file.getInputStream()); PDFTextStripper stripper = new PDFTextStripper(); return stripper.getText(doc); } public JsonNode parseJson(String jsonContent) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.readTree(jsonContent); } /* * 执行PDF与JSON的对比校验 * * @param pdfText PDF文本内容 * @param jsonConfig JSON配置 * @return 校验结果列表 / public List compareContent(String pdfText, JsonNode jsonConfig) { List results = new ArrayList<>(); // 执行字段存在性检查 performFieldChecks(pdfText, jsonConfig, results); // 执行正则表达式检查 performRegexChecks(pdfText, jsonConfig, results); // 执行数值范围检查 performNumericChecks(pdfText, jsonConfig, results); return results; } private void performFieldChecks(String pdfText, JsonNode config, List results) { JsonNode fieldChecks = config.path(“fieldChecks”); if (fieldChecks.isMissingNode()) return; Iterator<Map.Entry<String, JsonNode>> fields = fieldChecks.fields(); while (fields.hasNext()) { Map.Entry<String, JsonNode> entry = fields.next(); String fieldName = entry.getKey(); String expectedValue = entry.getValue().asText(); boolean found = pdfText.contains(expectedValue); results.add(new ValidationResult( “FIELD”, fieldName, expectedValue, found ? “Found” : “Not Found”, found )); } } private void performRegexChecks(String pdfText, JsonNode config, List results) { JsonNode regexChecks = config.path(“regexChecks”); if (regexChecks.isMissingNode()) return; Iterator<Map.Entry<String, JsonNode>> regexes = regexChecks.fields(); while (regexes.hasNext()) { Map.Entry<String, JsonNode> entry = regexes.next(); String checkName = entry.getKey(); String regexPattern = entry.getValue().asText(); Pattern pattern = getCachedPattern(regexPattern); Matcher matcher = pattern.matcher(pdfText); boolean found = matcher.find(); results.add(new ValidationResult( “REGEX”, checkName, regexPattern, found ? “Matched” : “Not Matched”, found )); } } private Pattern getCachedPattern(String regex) { return patternCache.computeIfAbsent(regex, Pattern::compile); } private void performNumericChecks(String pdfText, JsonNode config, List results) { JsonNode numericChecks = config.path(“numericChecks”); if (numericChecks.isMissingNode()) return; Iterator<Map.Entry<String, JsonNode>> numbers = numericChecks.fields(); while (numbers.hasNext()) { Map.Entry<String, JsonNode> entry = numbers.next(); String fieldName = entry.getKey(); JsonNode rangeConfig = entry.getValue(); double min = rangeConfig.path(“min”).asDouble(); double max = rangeConfig.path(“max”).asDouble(); Pattern pattern = getCachedPattern(fieldName + ":?\s(\d+\.?\d*)"); Matcher matcher = pattern.matcher(pdfText); if (matcher.find()) { try { double value = Double.parseDouble(matcher.group(1)); boolean valid = value >= min && value <= max; results.add(new ValidationResult( “NUMERIC”, fieldName, String.format(“范围 [%.2f, %.2f]”, min, max), String.valueOf(value), valid )); } catch (NumberFormatException e) { results.add(new ValidationResult( “NUMERIC”, fieldName, String.format(“范围 [%.2f, %.2f]”, min, max), “解析失败”, false )); } } else { results.add(new ValidationResult( “NUMERIC”, fieldName, String.format(“范围 [%.2f, %.2f]”, min, max), “未找到”, false )); } } } } package com.luxsan.llm.ai.controller; import com.fasterxml.jackson.databind.JsonNode; import com.luxsan.common.core.domain.R; import com.luxsan.llm.ai.domain.ComparisonResult; import com.luxsan.llm.ai.domain.ValidationResult; import com.luxsan.llm.ai.service.impl.PdfJsonCompareService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping(“/api/pdf-json”) @RequiredArgsConstructor public class PdfJsonCompareController { private final PdfJsonCompareService compareService; /** * 上传PDF文件和JSON内容,返回对比结果 */ @PostMapping(“/compare”) public R compare(@RequestParam(“pdfFile”) MultipartFile pdfFile, @RequestParam(“jsonContent”) String jsonContent) throws Exception { //读取PDF文本 String pdfText = compareService.readPdfText(pdfFile); // 2. 解析JSON配置 JsonNode jsonConfig = compareService.parseJson(jsonContent); // 3. 执行对比校验 List results = compareService.compareContent(pdfText, jsonConfig); return R.ok(results); } } package com.luxsan.llm.ai.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @NoArgsConstructor @AllArgsConstructor @Data public class ComparisonResult { private int pdfTextLength; private List details; } package com.luxsan.llm.ai.domain; 到时候我重新给一个json的样式也好改嘛 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** 校验结果封装类 */ @Data @AllArgsConstructor @NoArgsConstructor public class ValidationResult { private String checkType; // 检查类型: FIELD/REGEX/NUMERIC private String fieldName; // 字段名/检查项名 private String expected; // 预期值/规则 private String actual; // 实际值 private boolean valid; // 是否通过 } 我重新给一个json样式 到时候好改嘛
最新发布
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值