【问题标题】:Spring @InitBinder on @RequestBody@RequestBody 上的 Spring @InitBinder
【发布时间】:2015-07-28 15:34:37
【问题描述】:

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

我有一个这样定义的弹簧控制器:

@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 来声明允许或不允许的字段,但是如果我检查控制器内的 personDTO,则会填充其他字段(例如,如果传递“id”:“1234”) .

有什么提示吗?

binder 代码如下:

    @InitBinder("orderJson")
protected void orderJsonBinder(WebDataBinder binder){
    binder.setAllowedFields(new String[]{"address"});
}

我错过了什么吗?

最好的问候,

卢卡。

【问题讨论】:

    标签: spring


    【解决方案1】:

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

    [这是一个] HttpMessageConverter 实现,可以使用 Jackson 的 ObjectMapper 读取和写入 JSON。 JSON 映射可以通过使用 Jackson 提供的注释根据需要进行自定义。当需要进一步控制时,可以通过 ObjectMapper 属性注入自定义 ObjectMapper,以应对需要为特定类型提供自定义 JSON 序列化器/反序列化器的情况。默认情况下,此转换器支持 (application/json)。

    @InitBinder只能配置@ModelAttribute注解参数的绑定。在这里没用。如果 Jackson 注释还不够,您将不得不使用自定义对象映射器。

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

    【讨论】:

    • 谢谢谢尔盖。根据您的提示,我必须为jackson编写一个自定义ObjectMapper(在我的应用程序spring中使用类上的JsonSerialize注释,因此在控制器中json自动转换为java对象。问题是对于同一个类注释JsonSerialize,我需要不同方法的不同行为(例如,在 addAddress 中我只需要地址字段,也许在 addCredit 卡中我只需要 creditCart 字段。你知道我如何为不同的 Controller/RequestMapping 编写自定义 ObjectMapper 吗?
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 2015-06-09
    • 2012-10-08
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多