【Java后端进行ai coding实践系列】如何使用ai coding实现计划任务增删改查

文章目录

背景,尝试使用ai coding工具针对当前项目进行简单实践

开发的目标

这里有一个简单的接口开发,就是通过一个目标设置,用户可以事先存储两个值,一个是步数目标,一个是睡眠目标。

根据原先的产品逻辑,用户必须同时设置步数目标、睡眠目标两个数值。但是需求变动了,变动点是步数目标和睡眠目标不用同时设置,只要设置一个就可以了。

代码逻辑修改部分。

原有代码片段详解.

实体类

java 复制代码
@Data
public class GoalSettingsSaveReq {
    
    /**
     * 目标设置ID
     */
    @ApiModelProperty(value = "目标设置ID")
    private String goalSettingId;
    
    /**
     * 步数目标
     */
    @NotNull(message = "步数目标不能为空")
    @Min(value = 1000, message = "步数目标不能小于1000")
    @Max(value = 65000, message = "步数目标不能大于50000")
    @ApiModelProperty(value = "步数目标")
    private Integer stepTarget;
    
    /**
     * 睡眠目标
     */
    @NotNull(message = "睡眠目标不能为空")
    @Min(value = 1, message = "睡眠目标不能小于0.5小时")
    @Max(value = 30, message = "睡眠目标不能大于15小时")
    @ApiModelProperty(value = "睡眠目标")
    private BigDecimal sleepTarget;
}
java 复制代码
@RestController
@RequestMapping("/api/v2/mr/goal/settings")
@Slf4j
@RequiredArgsConstructor
@Api(tags = "目标设置管理")
public class GoalSettingsController {
    
    private final GoalSettingsBusinessService goalSettingsBusinessService;
    
    @PostMapping("/saveOrUpdate")
    @ApiOperation("保存或修改目标设置")
    public CommonDataResponse<GoalSettingsVo> saveOrUpdate(
            @Validated @RequestBody GoalSettingsSaveReq request) {
        log.info("saveOrUpdate goal settings request: {}", JSONUtil.toJsonStr(request));
        String userId = GlassesContext.getUserIdByStr();
        return CommonDataResponse.make(goalSettingsBusinessService.saveOrUpdate(request, userId));
    }
    }

1. 编写需求提示词,让iflow帮忙开发。

提示词

com.qiuguo.server.glasses.controller.GoalSettingsController#saveOrUpdate 方法帮我调整一下,我需要调整一下字段的处理逻辑。在目标设置请求的时候允许只存在步数目标 以及 睡眠目标 , 但是不允许两个都是空值。帮我调整一下。

在计划模式下,iflow根据当前的提示词,会根据用户的需求,先去查找文件,以及周围的代码(读取GoalSettingsController接口,比如接口的GoalSettingsSaveReq请求对象,接口的返回对象 GoalSettingsVo, GoalSettingsBusinessService,GoalSettingsService等等依赖)

可以看到这一过程是自动的,然后iflow会根据当前收集的上下文信息(包括用户提示词(提问),搜索到的代码片段),提供了一个当前的计划。

在仔细阅读该代码,可以发现,计划分了三步走。

java 复制代码
根据您的需求,我需要调整目标设置的字段处理逻辑。目前的`GoalSettingsSaveReq`类中,`stepTarget`和`sleepTarget`两个字段都被设置为`@NotNull`,这意味着两个字段都必须有值。根据您的要求,需要修改为:在目标设置请求中只允许存在*步数目标*以及*睡眠目标*,但不允许两个都是空值。
我的计划是:                                                      
 1. 修改`GoalSettingsSaveReq`类,将`stepTarget`和`sleepTarget`字段的`@NotNull`注解移除,允许它们为空
 2. 在`GoalSettingsServiceImpl`的`saveOrUpdate`方法中添加校验逻辑,确保`stepTarget`和`sleepTarget`不能同时为空
 3. 如果两个字段都为空,则抛出业务异常,提示用户至少设置一个目标

这样可以满足您的需求,即允许单独设置步数目标或睡眠目标,但不允许两个都为空。

很显然,以上的计划能瞒住普通的需求。

但是作为一个有过其他方案开发的经验者 ,我完全可以使用另一种编码方式去实现。因此搜选择了** 3.继续规划** 使用。也就是选择了如下的计划调整 步骤。

计划调整

提示词: 校验的过程我使用 Java Bean Validation提供ConstraintValidator定义自定义校验,来实现检验逻辑。帮我重新规划一下。

计划回复。

java 复制代码
根据您的需求,我将使用Java Bean Validation的ConstraintValidator来实现目标设置的校验逻辑。目前的`GoalSettingsSaveReq`类中,`stepTarget`和`sleepTarget`两个字段都被设置为`@NotNull`,这意味着两个字段都必须有值。根据您的要求,需要修改为:在目标设置请求中只允许存在*步数目标*以及*睡眠目标*,但不允许两个都是空值。

我的计划是:
1.  创建一个新的自定义校验注解`@ValidateGoalTargets`,用于校验目标设置请求中的步数目标和睡眠目标
2. 实现一个对应的校验器`GoalTargetsValidator`,继承`ConstraintValidator`接口,确保`stepTarget`和`sleepTarget`不能同时为空
3. 在`GoalSettingsSaveReq`类上添加这个自定义注解,移除原有的`@NotNull`注解
4. 在校验器中实现具体的校验逻辑:
 - 当`stepTarget`和`sleepTarget`都为null时,校验失败
 - 当至少有一个字段有值时,校验通过
5. 添加适当的错误提示信息,告知用户至少需要设置一个目标

这样可以满足您的需求,即允许单独设置步数目标或睡眠目标,但不允许两个都为空,并且使用了Java Bean Validation的标准方式来实现

基本上看以上的描述,基本功能已经基本上满足了我的需求。但是,一个很重要的问题是,计划调整只是添加了简单的校验,但是并没有帮我调整业务逻辑,也就是后续的service具体实现,因为字段的变更,可能会影响业务逻辑。所以,我仍然选择了** 3.继续规划** 使用。也就是选择了如下的进一步计划调整 步骤。

进一步计划调整。

提示词:

同时帮我添加一个非常重要的步骤,在修改了校验之后,还需要调整业务逻辑,帮忙看看需要调整哪些业务逻辑。

回复:

计划回复

shell 复制代码
根据您的需求,我已经完成了对目标设置校验逻辑的规划,具体包括以下几个方面:

1. 创建自定义校验注解@ValidateGoalTargets:定义一个新的注解用于校验目标设置请求中的步数目标和睡眠目标。
2. 实现GoalTargetsValidator校验器:实现一个继承ConstraintValidator的校验器,确保stepTarget和sleepTarget不能同时为空。
3. 改GoalSettingsSaveReq类:移除原有的@NotNull注解,并添加自定义的@ValidateGoalTargets注解。
4. 检查并调整GoalSettingsServiceImpl中的业务逻辑:确认该类中的saveOrUpdate方法不需要额外的校验逻辑调整,因为校验将由Java Bean Validation在Controller层自动完成。
5. 检查并调整GoalSettingsBusinessServiceImpl中的业务逻辑:确认该类中的saveOrUpdate方法不需要额外的校验逻辑调整,因为它直接调用DaoService的方法。
6. 检查Controller层:确认GoalSettingsController中的saveOrUpdate方法已经使用了@Validated注解,能够自动触发Java Bean Validation。
通过以上调整,我们可以实现目标设置的校验逻辑:允许单独设置步数目标或睡眠目标,但不允许两个都为空,并且使用了Java Bean Validation的标准方式来实现。这样既满足了业务需求,又保持了代码的一致性和可维护性。 

看了一下,基本上没有大毛病了,那么我们就开始让ai帮忙写一下代码吧。请选择是,使用 yolo 模式编辑,请去上趟厕所。回来就会给我一个非常好的答案了。

这里提示一下,其实还有一个功能需要添加这里方便演示我就不做下一步操作了,核心的步骤[测试],""" 请给我添加一个测试用例。"""

runing and go to wc

最终回复

show my code

java 复制代码
public class GoalTargetsValidator implements ConstraintValidator<ValidateGoalTargets, GoalSettingsSaveReq> {

    @Override
    public boolean isValid(GoalSettingsSaveReq goalSettings, ConstraintValidatorContext context) {
        // 检查stepTarget和sleepTarget是否都为空
        if (Objects.isNull(goalSettings.getStepTarget()) && Objects.isNull(goalSettings.getSleepTarget())) {
            // 如果都为空,校验失败
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("至少需要设置一个目标(步数目标或睡眠目标)")
                    .addConstraintViolation();
            return false;
        }
        // 如果至少有一个不为空,校验通过
        return true;
    }
}
java 复制代码
@Constraint(validatedBy = GoalTargetsValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateGoalTargets {
    String message() default "至少需要设置一个目标(步数目标或睡眠目标)";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

很明显,ai flow已经帮我实现了功能,我只要看一遍就可以了。

结论。

在现实场景下ai coding目前仍然是一个需要靠经验(个人开发,领域经验),去开发的。当我们把问题描述地的确很精细的时候,【考虑开发过程中的并发,事务,等等,技术方案】,都需要经过历年的经验,希望以此篇致敬ai coding。希望以后能够越做越好。

这一篇是我的一个新的开始吧,后续我可能会根据自己这几个月来对ai coding的实践进行进一步梳理,也希望大家在开发的过程中出现的问题一起沟通,学习。

还有一个比较有趣的ai coding编码时间是,请看看从RTSP到HLS:构建一个简单的流媒体转换服务(java spring 这篇文章,这个项目也是由ai 完全开发的。这个过程挺有意思的,希望与大家共勉。

相关推荐
BlueBirdssh4 小时前
大量文本向量化 + Embedding 检索 + LLM 具体流程解析
人工智能·embedding
昔我往昔4 小时前
@ApiModel注解升级成@Schema注解
java
shaominjin1234 小时前
OpenCV 4.1.2 SDK 静态库作用与功能详解
android·c++·人工智能·opencv·计算机视觉·中间件
FlagOS智算系统软件栈4 小时前
全球 PyTorch 大会与 Triton 大会释放强信号:算子语言繁荣和分化背后,编译器核心地位日益凸显
人工智能·pytorch·python·科技·深度学习·ai·开源
草莓熊Lotso4 小时前
模板进阶:从非类型参数到分离编译,吃透 C++ 泛型编程的核心逻辑
linux·服务器·开发语言·c++·人工智能·笔记·后端
和芯星通unicore4 小时前
扩展RTCM消息
人工智能·算法
来酱何人4 小时前
为什么要学深度学习?——从“传统编程”到“数据驱动”的思维跃迁(附AI落地案例)
人工智能·python·深度学习·机器翻译
程序员爱钓鱼4 小时前
Python编程实战 - Python基础入门 - 容器的常用操作与应用
后端·python·bpython
程序员爱钓鱼4 小时前
Python编程实战 - 函数与模块化编程 - 函数的定义与调用
前端·后端·python