spring 如何在DTO中使用@RequestParam

cdmah0mi  于 12个月前  发布在  Spring
关注(0)|答案(3)|浏览(159)

我必须使用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方法运行良好。

@RestController
@RequestMapping("/sample")
public class SampleController {

    @Autowired
    private SampleService sampleService;

    @GetMapping
    public Result getSampleList(@RequestParam SampleDTO param) throws Exception {
        // (@RequestParam(required=false) SampleDTO param)
        // (@ModelAttribute SampleDTO param)
        // (SampleDTO param)
        return sampleService.getFolderList(param);
    }

    @PostMapping
    public Result insertSample(@RequestBody SampleDTO param) throws Exception {
        return sampleService.insertFolder(param);
    }
}

字符串
// DTO示例

@Getter // I didn't attach @Setter because of @Builder.
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Alias("SampleDTO")
public class SampleDTO {

    @NotNull
    private Long sampleNo;

    @NotBlank
    private String sampleName;

    private String sampleDesc;

    @Builder
    public SampleDTO(Long sampleNo, String sampleName, String sampleDesc) {
        this.sampleNo = sampleNo;
        this.sampleName = sampleName;
        this.sampleDesc = sampleDesc;
    }

}

db2dz4w8

db2dz4w81#

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

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

字符串

cidc1ykv

cidc1ykv2#

@GetMapping
public Result getSampleList(@RequestParam("param") SampleDTO param) throws Exception {
    // (@RequestParam(required=false) SampleDTO param)
    // (@ModelAttribute SampleDTO param)
    // (SampleDTO param)
       return sampleService.getFolderList(param);
    }
}

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

3ks5zfa0

3ks5zfa03#

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

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

public class SampleDTO {
    private String sampleName = "myDefaultValue";

    //setters
}


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

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

相关问题