Spring可以在通用控制器中设置@RequestBody的值吗?

0x6upsns  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(128)

我有一个通用的控制器,它有一个create()方法,使用一些通用类MapPOST请求。我已经创建了该控制器的一个子类,它提供特定的服务和DTO类型。
理论上,子类控制器不需要实现自己的create()方法,但是我发现,如果我不在子类中实现create()方法,当我发出请求时,@RequestBody参数就不能正确设置。

超类别

public abstract class GenericController<InputDtoClass, ModelClass> {
    @PostMapping
    public @ResponseBody ModelClass create(@Valid @RequestBody InputDtoClass input) {
        return service.create(input);
    }
}

子类别

@RestController
@RequestMapping("/my/api/path")
public class SpecificController extends GenericController<SpecificInputDto, SpecificModel> {

}

我所期望的是,当我用一些数据调用POST /my/api/path时,我的程序应该调用超类的create()方法,填充SpecificInputDto对象,然后验证它。
程序正在正确调用create()方法,并且它正在根据SpecificInputDto类中的注解字段正确地尝试验证输入对象。但是输入对象本身并没有设置任何值。(为了澄清,如果删除@Valid标记,可以看到传递了正确类型的对象,所有字段都为空)。考虑到程序似乎可以很好地处理一般类型的查询参数类,这一点尤其奇怪。只有用@RequestBody注解的字段没有被填充,即使Spring * 似乎 * 知道它应该是什么特定类型。

EDIT:如果我将通用控制器更改为使用特定的InputDto类型,它也无法填充。但是复制到子类中的相同方法可以正常工作。

pxiryf3j

pxiryf3j1#

显然,每次我使用VSCode的自动完成导入@RequestBody时,它都决定导入io.swagger.v3.oas.annotations.parameters.RequestBody而不是org.springframework.web.bind.annotation.RequestBody
导入正确的RequestBody类为我解决了这个问题。

相关问题