java - Spring Framework 中最好的请求参数映射策略是什么?
问题描述
我是 Java Web 开发人员,通常开发 Spring MVC。
我一直在使用@RequestMapping 或@RequestParam 映射到Controller 处的hashMap。
这是一种可怕的方式。使用值时,我应该始终转换类型。
但是现在我尝试使用@ModelAttribute 在 Controller 上编写干净的代码。
但是,有一些问题。
案例 1) 为每个 EndPoint 制作 DTO。
我们可以为每个 EndPoint 做 DTO,但是 DTO 会有很多重复的属性。
@Getter
@Setter
@ToString
class GetUserInfoDTO {
private String id;
private String name;
}
@Getter
@Setter
@ToString
class PostUserInfoDTO {
private String name;
private Integer age;
private String address;
private String gender;
private String email;
private Date joinDate;
}
在控制器中,
@GetMapping("/user")
public ResultDTO getUserInfo (@ModelAttribute GetUserInfoDTO){
...
return ResultDTO;
}
@PostMapping("/user")
public ResultDTO postUserInfo (@ModelAttribute PostUserInfoDTO){
...
return ResultDTO;
}
在这种情况下,我们可以为每个端点应用独立的验证策略。
例如..
@Getter
@Setter
@ToString
class GetUserInfoDTO {
@NotNull
private String id;
private String name;
}
@Getter
@Setter
@ToString
class PostUserInfoDTO {
@NotNull
private String name;
@NotNull
private Integer age;
@NotEmpty
private String address;
private String gender;
private String email;
private Date joinDate;
}
像这样。
但是制造了如此多的模型类,并且存在如此多的重复属性。
case 2. 为每个Controller做一个通用的DTO。
我们可以为每个 Controller 制作 DTO,并重用它们。
@Getter
@Setter
@ToString
class UserInfoDTO {
private String id;
private String name;
private Integer age;
private String address;
private String gender;
private String email;
private Date joinDate;
}
@GetMapping("/user")
public ResultDTO getUserInfo (@ModelAttribute UserInfoDTO){
//I want only id, name
...
return ResultDTO;
}
@PostMapping("/user")
public ResultDTO postUserInfo (@ModelAttribute UserInfoDTO){
...
return ResultDTO;
}
但是在这种情况下,我们只能传递特定的属性。
如果有人发送了 id 和 name 以外的其他参数,我们不会注意到。(不会发生 400 错误)
代码帮助不能向我们推荐在单个端点使用的特定属性。
我不喜欢这些案例。
在第一种情况下,我应该制作这么多模型,它的管理将非常困难。
第二种情况,存在不必要的属性,并且很难对每个端点进行验证。
哪种方式最好?
或者你能推荐另一种将请求参数映射到模型对象的方法吗?
解决方案
推荐阅读
- ios - Swift:限制对特定框架的访问
- python - 使用 cumsum() 后如何将 '0' 替换为空白,但不应影响其中包含 '0' 的超过 1 位数字值?
- oracle - 如何在 Oracle Apex 的插件匿名代码块中引用 PL/SQL 函数
- scala - 如何解释用大括号括起来的函数值(菊石问题)
- r - R:如何将字符串参数转换为变量?
- angular - RXJS 用暂停/间隔监听
- c++ - 使用 QTreeView(或 QAbstractItemView)在项目激活时打开对话框,或单击编辑项目
- algorithm - 带约束的二分匹配
- azure - 无法访问租户间的 OneDrive 存储
- reactjs - 当 ref.current 被赋值时运行 useEffect