有关 springboot 接受参数和返回参数的问题

2022-09-09 09:12:57 +08:00
 kqq19930511

比如数据库有个表,对应 java 模型是:

public class User {
    @Comment("用户 id")
    @Column(length = 36)
    private String id;
    @Comment("用户名")
    private String username;
    @Comment("昵称")
    private String nickname;
    @Comment("登录密码")
    private String password;
    @Comment("密码过期时间")
    private Date passwordExireTime;
    @Comment("0: 新用户 1: 正常使用 2:停止使用")
    private Integer status;
    @Comment("最近登录时间")
    private Date loginTime;
    @Comment("连续登录错误次数")
    private Integer loginErrorCount;
    @Comment("创建时间")
    private Date createdAt;
    @Comment("所属组")
    private String userGroupId;
}

举个例子,现在有新增、删除、更新接口,每个接口传的参数不一样并且校验参数的逻辑也不一样,现在我的处理是生成三个参数对象: InsertUserForm 、DeleteUserForm 、UpdateUserForm ,然后用不同的校验逻辑,这三个对象都会返回不同的参数,需要新建三个对象存储返回参数 InsertUserVO, DeleteUserVO, UpdateUserVO ,想问一下实际怎么处理这些情况的?

3005 次点击
所在节点    Java
23 条回复
gwkoooo
2022-09-09 09:33:36 +08:00
新增和编辑可以用 @Validate 的分组校验,返回的话就分开新建,也可以请求参数抽取一个 BaseForm ,返回参数收取一个 BaseVO 继承一下
KingOfUSA
2022-09-09 09:33:44 +08:00
1. 对于你这种通过对象入参的方式暂时还没有想到更好的处理方式。我个人更喜欢普通类型的入参,然后定义一些常用的规则(比如类型、长度、是否避免等),在 controller 层对于参数加上不同的规则。

2. 返回参数的问题,可以使用我写的这个库 https://github.com/ksprider/Surgical ,在 controller 层通过注解的方式来决定返回不同的属性,避免了 vo1 vo2 vo3...难以复用的情况
ylls
2022-09-09 09:34:40 +08:00
@Validated 配上 javax.validation.constraints 的 groups
KingOfUSA
2022-09-09 09:34:47 +08:00
@KingOfUSA 是否避免 = 是否必填
7911364440
2022-09-09 09:39:01 +08:00
Edsie
2022-09-09 09:56:09 +08:00
定义一个领域层面的 User ,(你上面的 User 是属于 Entity 的)
```
public class User {
private String username;
private String nickname;
private String password;
}
```
create,update,delete 主题都是它,校验逻辑通过分组校验分开
git00ll
2022-09-09 10:48:06 +08:00
我觉得建三个没问题,区分出来比较清晰。1f 那样做 会在增加复杂性。
并且这种接口写完了一般不会改
xiao109
2022-09-09 11:20:36 +08:00
Map 打天下
KevinBlandy
2022-09-09 11:22:17 +08:00
Validate 那 group 真不建议用,用着用着能给自己整糊涂了。不同业务接口,创建不同对象吧还是。必要的时候可以用 MapStruct 之类的工具转换。
frank1256
2022-09-09 11:48:27 +08:00
MapStruct
egfegdfr
2022-09-09 13:45:53 +08:00
entity 类,能满足的情况下,就直接用 entity ,entity 不够的话,增加 vo 类。能复用的情况下,尽量复用。如果每一个接口都严格按照你这种方式来,会照成大量的重复性的代码。不利于维护
kqq19930511
2022-09-09 13:57:16 +08:00
@xiao109 可维护性太差了
kqq19930511
2022-09-09 13:57:41 +08:00
@KevinBlandy 是的,现在啊就是用 mapstruct 转换的
kqq19930511
2022-09-09 13:58:24 +08:00
@Edsie 需要生成 swagger 文档,这种设计不行吧
Leviathann
2022-09-09 13:58:24 +08:00
就分开啊
不一样的东西不要放一起
或者抽一个 UserCommons 之类的接口把共性提取出来
kqq19930511
2022-09-09 13:59:58 +08:00
@7911364440 怎么配合 swagger 生成文档呢?
7911364440
2022-09-09 14:21:08 +08:00
@kqq19930511 可以在字段注释上加一些特殊说明,比如新增时必填,修改时必填之类的
Rache1
2022-09-09 17:17:04 +08:00
挤在一起就违反单一原则了 😏
likeme
2022-09-09 17:39:27 +08:00
我也是按照你这个思路开发的。这样挺好啊,没有耦合,只不过代码冗余比较多,这点冗余没什么吧。。。起码可以让代码看的清晰明了。
zhuweiyou
2022-09-09 17:40:59 +08:00
Map 一把梭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/878798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX