首页 > 解决方案 > 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 错误)

代码帮助不能向我们推荐在单个端点使用的特定属性。

我不喜欢这些案例。

在第一种情况下,我应该制作这么多模型,它的管理将非常困难。

第二种情况,存在不必要的属性,并且很难对每个端点进行验证。

哪种方式最好?

或者你能推荐另一种将请求参数映射到模型对象的方法吗?

标签: javaspringspring-mvc

解决方案


推荐阅读