在控制器中为每个 RequestMapping 不同地配置 FAIL_ON_UNKNOWN_PROPERTIES

2023-12-02

我想在不同的设备上以不同的方式处理 json 到对象的转换@RequestMapping在我的控制器中。

我相信,如果我们在 spring-boot 项目中添加 Jackson 依赖项,它会处理 json 到对象的转换,#spring.jackson.deserialization.fail-on-unknown-properties=trueproperty 将确保如果 json 中存在一些未知属性,转换将会失败(如果我错了,请纠正我)。

我们能否在本地告诉 Jackson 何时在未知属性上失败以及何时忽略这些属性。

以下是使用标志的代码片段。

    @GetMapping(value = "sample")
    public @ResponseBody UserDTO test(@RequestParam String str, @RequestParam boolean failFast) {
        ObjectMapper map = new ObjectMapper();
        if( failFast) {
            map.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
        } else {
            map.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
        UserDTO userDTO = null;
        try {
            userDTO = map.readValue(str, UserDTO.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return userDTO;
    }

我不需要像我正在使用的那样在运行时处理它@RequestParam.是否有一些属性可以用来标记映射,在哪里检查未知属性以及在哪里忽略它们。

Edit: 我正在寻找的是更改现有应用程序以处理每个映射的未知属性。例如:

        @PostMapping(value = "fail/fast")
        public @ResponseBody UserDTO test(@FAIL_ON_UNKNOWN @RequestBody UserDTO userDTO, @RequestParam boolean failFast) {
            ..///processing...
            return userDTO;
        }

        @PostMapping(value = "fail/safe")
        public @ResponseBody UserDTO test( @RequestBody UserDTO userDTO, @RequestParam boolean failFast) {
                ..///processing...
                return userDTO;
        }

如果可以为每个映射添加一些验证之王,那么我不需要更改所有现有映射来自定义未知属性,并且代码更改将是最少的。


Jackson's ObjectMapper允许您创建新的ObjectReader具有自定义配置。您可以创建一个通用的ObjectMapper您的应用程序中的实例以及某些控制器将其用作创建自定义阅读器的基础对象。它将允许您使用所有常见功能和注册模块,并在需要时进行少量更改。参见下面的控制器:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.Objects;

@RestController
@RequestMapping(value = "/options")
public class JacksonOptionsController {

    private final ObjectMapper objectMapper;

    @Autowired
    public JacksonOptionsController(ObjectMapper objectMapper) {
        this.objectMapper = Objects.requireNonNull(objectMapper);
    }

    @PostMapping(path = "/fail")
    public ResponseEntity<String> readAndFastFail(HttpServletRequest request) throws IOException {
        String json = readAsRawJSON(request);
        Payload payload = createFailFastReader().readValue(json);

        return ResponseEntity.ok("SUCCESS");
    }

    @PostMapping(path = "/success")
    public ResponseEntity<String> readAndIgnore(HttpServletRequest request) throws IOException {
        String json = readAsRawJSON(request);
        Payload payload = createSafeReader().readValue(json);

        return ResponseEntity.ok("SUCCESS");
    }

    private ObjectReader createFailFastReader() {
        return objectMapper
                .readerFor(Payload.class)
                .with(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    }

    private ObjectReader createSafeReader() {
        return objectMapper
                .readerFor(Payload.class);
    }

    private String readAsRawJSON(HttpServletRequest request) throws IOException {
        try (InputStreamReader reader = new InputStreamReader(request.getInputStream())) {
            try (StringWriter out = new StringWriter(64)) {
                reader.transferTo(out);
                return out.toString();
            }
        }
    }
}

Payload类只有一个属性 -id。在我们使用的一个控制器中ObjectReader已启用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES。在其他我们使用ObjectReader使用默认配置禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES.

对于测试请求:

curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{"id":"some-value","id1":1}' http://localhost:8080/options/fail

应用程序抛出异常并请求:

curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{"id":"some-value"}' http://localhost:8080/options/fail

它返回SUCCESS价值。当我们发送上面两个有效负载时http://localhost:8080/options/success URL,应用程序在两种情况下都会返回SUCCESS value.

也可以看看:

  • 如何在 Spring Rest 控制器中访问纯 json 主体?
  • Spring Boot:自定义 Jackson ObjectMapper
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在控制器中为每个 RequestMapping 不同地配置 FAIL_ON_UNKNOWN_PROPERTIES 的相关文章

随机推荐

  • 如何设置邮件服务器?

    我希望任何发送电子邮件至 电子邮件受保护 并且服务器可以获取邮件 因此我可以使用一些服务器端脚本语言 例如 Ruby 来解析电子邮件的内容 Ruby 解决方案会很棒 如果您从未设置过 smtp 服务器 并且不愿意深入研究和学习很多内容 那么
  • 在表单上的标签或文本框中显示字段的描述

    我想要做的是在表单上的标签中显示当前所选字段的描述 我觉得它当前显示的位置 左下状态栏 几乎不明显 如何访问状态栏中的该值 例如 在我的表单上 当我选择 员工姓名 字段时 在左下角以小字显示 您正在注册的员工的姓名 我知道在我的表单上的某些
  • 使用 typescript 将 javascript 模块导入为动态

    我想导入一个普通的 javascript 模块 例如vhost 使用 CommonJS 进入我的 node js 打字稿文件 我可以用下面的行来做到这一点 import vhost require vhost 我们假设我在互联网上找不到 d
  • JavaScript-onclick

    第一次在这里发帖 但天知道我一直使用这个网站来搜索问题 P 好吧 我现在遇到了自己的问题 因为我似乎无法轻松地在 Google 上进行搜索 并且在玩完之后搞了两个多小时 终于决定发帖问一下大家的想法 我在这里想要完成的是 当您将鼠标悬停在
  • 如何将json对象数组保存到mongoose?

    我正在尝试将对象数组保存到猫鼬模式 但无法将数据加载到laptop模式我只看到一个插入包含id 如何将 json 对象数组保存到 mongoose 模式 控制器 js var laptopData name Hp probook 15 1
  • 以编程方式创建和呈现模态视图控制器

    我正在尝试以编程方式从使用情节提要启动的视图控制器中声明模式视图控制器 我希望看到一个空白视图 但我只看到来自第一个控制器的 Web 视图 void viewDidLoad super viewDidLoad NSString fullUR
  • 如何将 Excel 工作表导出为图像?

    我正在尝试从 Excel 工作表生成图像 经过大量研究后 我使用以下代码 但在某些时候我遇到了异常 using System using System Collections Generic using System Linq using
  • Flexslider 延迟加载 - 仅在真正需要时加载图像

    这实际上只是对 Flexslider 延迟加载的回答的后续内容here我正在使用我在下面粘贴的代码 我想更改它 以便仅在真正需要时加载图像 我尝试了其他 Flexslider 属性 之前 和之后 但它们在第一张幻灯片上造成了延迟 请问我可以
  • 如何使用 WSO2 ESB 从数据库检索多行?

    我想使用 wso2 esb 检索数据库中的多行 使用 dblookup 中介器我只能检索一行 建议使用 WSO2 DSS 你能帮我使用 DSS 完全检索 ESB 中的多行吗 Thanks 如果您不想使用 DSS 这就是我们的情况 那么您可以
  • React js组件,map可以工作,foreach不行

    我有一个呈现标签的组件 它循环遍历地图并显示数据 我尝试使用 forEach 但它不起作用 但是 如果我将映射转换为数组 它就可以工作 foreach 也不适用于数组 我在这里缺少什么 这有效 render return div class
  • 重命名模型和关系字段的 Django 迁移策略

    我计划重命名现有 Django 项目中的多个模型 其中有许多其他模型与我要重命名的模型具有外键关系 我相当确定这将需要多次迁移 但我不确定确切的过程 假设我从 Django 应用程序中的以下模型开始 名为myapp class Foo mo
  • Zoom:1;有什么bug在 CSS 中修复?

    我见过人们应用 CSS 属性zoom 1 在 HTML 元素上 他们为什么这样做 它修复了什么错误 这提供了一个称为hasLayout在 Internet Explorer 版本 7 及更低版本中 关于这个主题的权威文章在这里 http w
  • 在 iPhone 应用程序启动期间(即应用程序加载期间)播放电影文件

    我想播放电影文件或任何动画文件 直到时间应用程序未完全加载 有什么简单的方法可以做到吗 告诉别人他们想做什么是值得怀疑的 我的客户想要播放一部电影 而这只是一部 3 秒的电影 这就是所谓的品牌推广 如果他的用户不喜欢它 他们会告诉他
  • QT QImage - 将图像的一部分复制为多边形

    尝试将图像的一部分复制为多边形 特别是五边形 但我更感兴趣的是如何复制为除矩形之外的任何内容 以下代码仅允许复制为矩形 QImage copy const QRect rect QRect const inline QImage copy
  • AWS Fargate - 不使用 SES 端点从私有子网发送电子邮件

    我有一个带有自动缩放 Fargate 容器的配置 在公共子网配置或 NAT 配置中使用 SES 简单电子邮件服务时 电子邮件可以正确发送 当容器移动到具有 SES 端点接口的私有子网时 不再发送电子邮件 以下两个带有连接超时消息的选项 对于
  • 如何制作一组列表

    我有一个这样的列表 i 1 2 3 2 4 5 1 2 3 2 4 5 我想获得一个包含 唯一 列表 基于其元素 的列表 例如 o 1 2 3 2 4 5 我无法使用set 因为列表中有不可散列的元素 相反 我正在这样做 o for e i
  • 从 jBPM 流程访问数据库

    如何从 jBPM 流程访问数据库 您认为我可以使用脚本任务或人工任务的进入 退出操作连接到数据库吗 我建议不要使用人工任务的进入 退出操作来存储代码 弄清楚您将代码放在哪里可能是一场噩梦 因为当人工任务有代码时没有视觉线索 您可以尝试脚本任
  • Grails 限制表创建

    我想使用 Grails 功能在有限的基础上创建 更新数据库表 具体来说 我希望 Grails 管理一些表 但不是全部 有没有办法限制 Grails 管理的表 或者这是一个全有或全无的提议 一般来说 要么全有 要么全无 因为 Grails 使
  • 缓慢的 Skscene 过渡

    我有两个场景 家庭和玩耍 与到家庭场景的转换相比 到游戏场景的转换确实很慢 我想这是因为我的游戏场景中有更多的事情发生 有什么方法可以预加载播放场景吗 或者让过渡更加无缝 我对这个论坛的答案感兴趣预加载场景以防止延迟 但我不知道从哪里开始
  • 在控制器中为每个 RequestMapping 不同地配置 FAIL_ON_UNKNOWN_PROPERTIES

    我想在不同的设备上以不同的方式处理 json 到对象的转换 RequestMapping在我的控制器中 我相信 如果我们在 spring boot 项目中添加 Jackson 依赖项 它会处理 json 到对象的转换 spring jack