我有一个通用的控制器,它有一个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类型,它也无法填充。但是复制到子类中的相同方法可以正常工作。
1条答案
按热度按时间pxiryf3j1#
显然,每次我使用VSCode的自动完成导入
@RequestBody
时,它都决定导入io.swagger.v3.oas.annotations.parameters.RequestBody
而不是org.springframework.web.bind.annotation.RequestBody
。导入正确的
RequestBody
类为我解决了这个问题。