spring 如何在DTO中使用@RequestParam

cdmah0mi  于 2024-01-05  发布在  Spring
关注(0)|答案(3)|浏览(194)

我必须使用DTO创建GET方法。但是当我这样编写代码时↓,发生错误。org.springframework.web.bind.MissingServletRequestParameterException:方法参数类型SampleDTO的所需请求参数'param'不存在 *
在检查了这个错误之后,我发现我需要添加选项@RequestParam(required=false)。然后,我重新启动tomcat。虽然没有更多的错误,但我的参数为null(我实际上发送了sample_name)。x1c 0d1x
并且我尝试使用no annotation和@ModelAttribute,两者都出现相同的错误↓ * 起因:java.lang.NoSuchMethodError:org.springframework.beans.BeanUtils.getResolvableConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;

我该怎么办?请给予我建议。我不知道最好的方式处理DTO。因为我通常使用HashMap编码。
下面是我的示例代码。
//控制器示例
point:insertSample方法运行良好。

  1. @RestController
  2. @RequestMapping("/sample")
  3. public class SampleController {
  4. @Autowired
  5. private SampleService sampleService;
  6. @GetMapping
  7. public Result getSampleList(@RequestParam SampleDTO param) throws Exception {
  8. // (@RequestParam(required=false) SampleDTO param)
  9. // (@ModelAttribute SampleDTO param)
  10. // (SampleDTO param)
  11. return sampleService.getFolderList(param);
  12. }
  13. @PostMapping
  14. public Result insertSample(@RequestBody SampleDTO param) throws Exception {
  15. return sampleService.insertFolder(param);
  16. }
  17. }

字符串
// DTO示例

  1. @Getter // I didn't attach @Setter because of @Builder.
  2. @NoArgsConstructor
  3. @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
  4. @Alias("SampleDTO")
  5. public class SampleDTO {
  6. @NotNull
  7. private Long sampleNo;
  8. @NotBlank
  9. private String sampleName;
  10. private String sampleDesc;
  11. @Builder
  12. public SampleDTO(Long sampleNo, String sampleName, String sampleDesc) {
  13. this.sampleNo = sampleNo;
  14. this.sampleName = sampleName;
  15. this.sampleDesc = sampleDesc;
  16. }
  17. }

db2dz4w8

db2dz4w81#

为了将请求参数绑定到对象,你需要在你的DTO类中有标准的getter/setter。将@Setter添加到你的方法中,然后你可以在没有任何注解的情况下进行绑定。

  1. @GetMapping
  2. public Result getSampleList(SampleDTO param) throws Exception {
  3. return sampleService.getFolderList(param);
  4. }

字符串

cidc1ykv

cidc1ykv2#

  1. @GetMapping
  2. public Result getSampleList(@RequestParam("param") SampleDTO param) throws Exception {
  3. // (@RequestParam(required=false) SampleDTO param)
  4. // (@ModelAttribute SampleDTO param)
  5. // (SampleDTO param)
  6. return sampleService.getFolderList(param);
  7. }
  8. }

字符串
像这样尝试,你应该指定变量

3ks5zfa0

3ks5zfa03#

  1. @GetMapping
  2. public Result getSampleList(SampleDTO param) throws Exception {}

字符串
删除@RequestParam Annotation并添加setter对我来说很有用。也可以在DTO中设置默认值,如:

  1. public class SampleDTO {
  2. private String sampleName = "myDefaultValue";
  3. //setters
  4. }


如果请求中包含的参数在dto中不存在,则会被忽略。
如果有一个dto成员变量不存在于请求中,并且没有默认值,则其为null。

是否有办法在dto中将params标记为required?

展开查看全部

相关问题