在Spring Framework中,哪种是最好的请求参数映射策略?

我是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错误)

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

我不喜欢这些情况。

在第一种情况下,我应该制作许多模型,并且管理将非常困难。

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

哪种方法最好?

还是可以建议将请求参数映射到模型对象的另一种方法?

评论