我是Java Web开发人员,通常开发Spring MVC。
我一直在使用@RequestMapping或@RequestParam将其映射到Controller上的hashMap。
这是可怕的方式。我应该总是在使用值时强制转换类型。
但是如今,我尝试使用@ModelAttribute在Controller上编写干净的代码。
但是,有一些问题。
情况1)为每个端点进行DTO。
我们可以为每个端点创建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;
}
像这样。
但是创建了这么多的模型类,并且存在着很多重复的属性。
情况2.为每个控制器设置通用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错误)
代码帮助不能推荐我们在单个端点上使用的特定属性。
我不喜欢这些情况。
在第一种情况下,我应该制作许多模型,并且管理将非常困难。
第二种情况,存在不必要的属性,并且很难为每个端点进行验证。
哪种方法最好?
还是可以建议将请求参数映射到模型对象的另一种方法?