Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring框架中哪种请求参数映射策略最好?_Java_Spring_Spring Mvc - Fatal编程技术网

Java Spring框架中哪种请求参数映射策略最好?

Java Spring框架中哪种请求参数映射策略最好?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我是JavaWeb开发人员,通常开发SpringMVC 我一直在使用@RequestMapping或@RequestParam来映射到控制器上的hashMap 这是一种可怕的方式。在使用value时,我应该始终强制转换type 但现在我尝试使用@modeldattribute在控制器上编写干净的代码 然而,也存在一些问题 案例1)对每个端点进行DTO。 我们可以为每个端点创建DTO,但DTO将具有许多重复的属性 @Getter @Setter @ToString class GetUserInf

我是JavaWeb开发人员,通常开发SpringMVC

我一直在使用@RequestMapping或@RequestParam来映射到控制器上的hashMap

这是一种可怕的方式。在使用value时,我应该始终强制转换type

但现在我尝试使用@modeldattribute在控制器上编写干净的代码

然而,也存在一些问题

案例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。

我们可以为每个控制器制作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和名称以外的其他参数,我们不会注意到。(400错误未发生)

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

我不喜欢这些箱子

在第一种情况下,我应该做这么多的模型,它的管理将是如此困难

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

哪条路最好


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

我们可以将所有参数和值作为映射实例获取。请检查这个。此方法需要显式代码来填充模型对象。我们可以将所有参数和值作为映射实例来获取。请检查这个。此方法需要显式代码来填充模型对象