gpt4 book ai didi

@RequestBody 上的 Spring @InitBinder

转载 作者:行者123 更新时间:2023-12-01 02:07:07 29 4
gpt4 key购买 nike

我正在尝试使用 @InitBind 注释仅映射请求正文中对象上的某些字段。

我有一个以这种方式定义的 Spring Controller :

@RequestMapping(value = "addAddress", method = RequestMethod.POST)
public Object addAddressToPerson(
HttpServletRequest request,
HttpServletResponse res,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "surname", required = false) String surname,
@RequestBody personDTO personJson,BindingResult result) {

客户端请求将是一个代表 personDTO 的 json,但出于安全原因,我不希望除地址之外的该字段映射到对象中。

输入将类似于:
{ "address":"123 Street","........}

personDTO 包含许多字段,并且由于 spring 将所有字段直接映射到 DTO 中,这可能是一个问题。

我已经看到一个解决方案是使用 Binder 来声明允许或不允许的字段,但是如果我检查 Controller 内的 personDTO,则会填充其他字段(例如,如果传递“id”:“1234”)。

任何提示?

活页夹代码如下:
    @InitBinder("orderJson")
protected void orderJsonBinder(WebDataBinder binder){
binder.setAllowedFields(new String[]{"address"});
}

我错过了什么吗?

最好的祝福,

卢卡。

最佳答案

但你是不是 将请求参数绑定(bind)到模型属性 bean,您只是要求 spring 使用适当的 MessageConverter 来转换请求正文。正如您所说的 Json,您将使用 MappingJackson2HttpMessageConverter(或带有 Jackson 1.x 的 MappingJacksonHttpMessageConverter)。 Spring 引用手册对此转换器说:

[这是一个] HttpMessageConverter 实现,可以使用 Jackson 的 ObjectMapper 读取和写入 JSON。 JSON 映射可以通过使用 Jackson 提供的注释根据需要进行自定义。当需要进一步控制时,可以通过 ObjectMapper 属性注入(inject)自定义 ObjectMapper,以应对需要为特定类型提供自定义 JSON 序列化器/反序列化器的情况。默认情况下,此转换器支持 (application/json)。
@InitBinder只能配置@ModelAttribute的绑定(bind)带注释的参数。在这里没用。如果 Jackson 注释还不够,您将不得不使用自定义对象映射器。

我很惊讶您可以使用 BindingResult@RequestBody 之后参数,因为文档说它应该遵循 @ModelAttribute一。

关于@RequestBody 上的 Spring @InitBinder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31680960/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com