Spring验证字符串值是JSON

2024-04-18

我的配置文件中有一些值,它应该是 JSON(它将作为字符串加载)。

我希望 Spring 在注入之前验证该值确实是有效的 JSON,否则会抛出错误。

我已经阅读了现有的验证注释,例如 -@NotNull, @Size, @Min, @Max, @Email, @NotEmpty etc.

有没有办法创建自定义验证器?

我想要一个验证器尝试将字符串转换为 JSON,如下例所示:如何在 Java 中将 jsonString 转换为 JSONObject https://stackoverflow.com/questions/5245840/how-to-convert-jsonstring-to-jsonobject-in-java.


可用的验证注释不提供这一点,因此您必须采用自定义实现。该任务分为 2 个简单步骤:

1.给定的String是否为JSON格式

有多个库能够解析(从而验证)字符串是否遵循 JSON 语法标准。让我们以我最喜欢的 GSON 为例(有many https://stackoverflow.com/questions/10174898/how-to-check-whether-a-given-string-is-valid-json-in-java/10174938)。这取决于您当前使用的库:

String string = "{\"foo\":\"bar\"}"
JsonParser jsonParser = new JsonParser();
try {
    jsonParser.parse(string);       // valid JSON
} catch (JsonSyntaxException ex) { 
    /* exception handling */        // invalid JSON
}

2.自定义验证注解

首先提供启用验证的依赖项:

  • 组ID:org.hibernate
  • 工件ID:hibernate-validator

创建用于验证的注释:

@Documented
@Constraint(validatedBy = JsonStringValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonString {
    String message() default "The String is not in JSON format";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

...以及验证器通过注释处理验证:

public class JsonStringValidator implements ConstraintValidator<JsonString, String> {

    @Override
    public void initialize(JsonString jsonString) { }

    @Override
    public boolean isValid(String string, ConstraintValidatorContext context) {
        // Use an implementation from step 1. A brief example:
        try {
            new JsonParser().parse(string);
            return true;                    // valid JSON, return true
        } catch (JsonSyntaxException ex) { 
            /* exception handling if needed */
        }
        return false;                       // invalid JSON, return false
    }
}

用法非常简单:

@JsonString
private String expectedJsonString

此实现详细描述于拜尔东的 https://www.baeldung.com/spring-mvc-custom-validator.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring验证字符串值是JSON 的相关文章

  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • 有没有办法调用 VBA(MS Access 2002 或 2003)中任何控件的 BeforeUpdate 事件过程?

    在 VBA 中 我正在更改 Access 表单中的一些控件的值 我喜欢在执行此操作后运行这些控件的 BeforeUpdate 事件 因为它会检查字段之间的一致性 Private Sub ExampleProc1 Dim intCancel
  • Java:等于和==

    让我们看看我们有 2 个对用户定义类实例的引用 即 Java 中的 a 和 b 会不会有一种情况 a b 但 a equals b 返回 false 当然 实施 equals 完全取决于班级 所以我可以写 class Foo public
  • 在 Spring Webflux 中执行阻塞 JDBC 调用

    我使用 Spring Webflux 和 Spring data jpa 使用 PostgreSql 作为后端数据库 我不想在进行数据库调用时阻塞主线程 例如find and save 为了实现同样的目标 我有一个主调度程序Controll
  • grails 中的 log4j:如何登录文件?

    我的 grails config groovy 中有这个 log4j 配置 log4j error org codehaus groovy grails web servlet controllers org codehaus groovy
  • 使用 Microsoft REST API - Java 将 Xbox-Live GamerTag 转换为 XUID

    我有一个 Java 应用程序 它需要能够获取用户输入的 Minecraft Bedrock Edition 玩家标签 并将其转换为给定帐户的 XUID 以便我可以将其存储起来以供稍后列入白名单和参考目的 我一直在浏览 Microsoft R
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 检查更新时 Maven 无限期挂起

    我正在使用 Maven 构建一个项目 我是新手 并且它挂起 mvn package INFO Scanning for projects INFO INFO Building Presentation Reports INFO task s
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • Spring Boot 中 application.properties 可用的属性列表?

    Spring Boot文档说我们可以在application properties文件中设置属性 但我找不到列出可以设置的可用属性的文档 我在哪里可以找到这样的文档 例如 我想为嵌入式servlet设置documentRoot 我发现set
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • 如何根据从 jtextfield 和组合框接收的值将数据行添加到 Jtable

    我有一个JFrame表格有JTextFields JCombobox等等 我能够将这些值接收到变量 现在我想将接收到的数据添加到JTable当用户单击 添加 或类似的操作时在新行中 我创造了JTable使用 net beans 的问题是将这
  • Java 中的连接路径

    In Python我可以连接两条路径os path join os path join foo bar gt foo bar 我正在尝试在 Java 中实现相同的目标 而不用担心是否OS is Unix Solaris or Windows
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐

  • 使用 bash、Azure CLI 和 REST API 访问 CosmosDB - 如何正确获取令牌和哈希?

    我的最终目标是使用 bash 和 Azure CLI 将文档上传到现有的 CosmosDB SQL 实例 问题是 Azure CLI 确实如此不提供修改文档的命令 https learn microsoft com en us cli az
  • Spring MVC application.properties 不会被配置文件 application-dev.properties 覆盖

    我正在寻找一种根据 JVM 环境变量配置不同 application properties 文件的方法 我在 Spring 参考资料中找到了这个文档 除了 application properties 文件之外 还可以使用命名约定 appl
  • C# 中的异常有多昂贵?

    C 中的异常有多昂贵 只要堆栈不深 它们似乎并不会非常昂贵 然而我读到了相互矛盾的报道 有没有没有被反驳的明确报告 读到异常在性能方面代价高昂后 我编写了一个简单的测量程序 与该程序非常相似乔恩 斯基特 多年前发表 https web ar
  • 如何从 OsStr 和 str 组件构建 URL?

    此代码遍历文件夹 并查找以以下结尾的文件 txt 接下来 我想采取entry file name 这是属于std ffi os str OsStr输入 并将其加入BASE URL来形成一个 URL const FOLDER NAME str
  • 更改文件名后缀(使用 sed ?)

    我想改变文件名后缀来自文件 使用 bash 脚本 但有时有些文件带有一个句点 有些文件带有两个句点 现在我用这个 new file echo file sed s log suf 1 num 其中 new file 是新文件名 file 是
  • OMP_NUM_THREADS=1 时 #pragma ompatomic 的性能问题

    我观察到我正在编写的 openmp 代码出现了意外的 对我来说 行为 代码结构如下 pragma omp parallel for for int i 0 i
  • 真的有类似 Objective C++ 的东西吗?

    我正在读一本post http savoysoftware com blog p 114关于 iPhone 编程 我注意到关于 Objective C 的讨论 帖子中显示的代码看起来主要像 Objective C 但也有一些 C 代码片段
  • 如何将 Quickbooks 桌面应用程序与 PHP(网络应用程序)集成?

    在我的应用程序中 我想使用 php 通过 PHP 集成 QuickBooks 因此 我想从网络服务器 使用PHP 调用QuickBooks桌面版应用程序来推送数据和检索数据 我被困在这里了 我不知道从哪里开始 有人让我从 webconnec
  • 通用应用程序,适用于 iPhone 的纵向方向和 iPad 的横向方向

    我正在使用 Swift 创建一个通用应用程序 我使用过故事板和自动布局 要求是创建一个通用应用程序 仅支持 iPhone 的纵向方向和仅 iPad 的横向方向 我已经为 iPhone 开发了 UI 现在我将开始开发 iPad UI 此外 为
  • 温莎城堡生活方式问题

    我正在实现hangFire 它是我的项目中的一个作业调度库 我面临着与此相同的问题link https stackoverflow com questions 11873905 castle windsor lifestyle depend
  • 使用 for..of 迭代时删除 Set 中的元素是否安全?

    是否指定可以删除实例中的任意元素Set迭代时使用for of然后 你不会在一个元素上迭代多次 除了删除的元素之外 您不会错过迭代开始时集合中的任何其他元素 Yes 在迭代集合时添加元素和删除元素是完全可以的 JavaScript 2015
  • 分析 Windbg 中 !threadpool 和 !threads 的输出

    我已经在四台服务器上生成了转储 并正在分析 threadpool 和 threads 的输出 我注意到以下输出大致一致 0 024 gt threadpool CPU utilization 0 Worker Thread Total 2
  • 在 silverlight 中保存文件和异步回调

    在 Silverlight 中 您必须使用保存文件对话框来保存文件 您只能通过用户事件 即按钮单击 打开此对话框 我从 Web 服务调用异步返回文件数据 我如何将其保存到文件 如果我在服务调用之前询问他们 我将无法在数据返回后使用该流 如果
  • OpenJDK 8:无法解析主机名

    我正在尝试奔跑slf4j with log4jopenJDK 8 上的 2 8 Ubuntu 上的最新版本8u131 b11 0ubuntu1 17 04 1 当通过 maven openjdk 运行简单的 java 类时 无法解析本地主机
  • 如何读取cassandra数据而不区分大小写

    我需要从 cassandra 获取数据而不区分大小写 请帮我 Cassandra 中没有区分大小写的概念 所有数据都存储为byte 所以它甚至不是一个字符串 您可以制作自定义比较器 参见API http wiki apache org ca
  • 如何在 Excel 中根据验证结果进行条件格式设置?

    如果单元格无效 我想更改单元格的格式 在这种情况下 有效 意味着单元格未通过数据验证规则 我问这个问题是因为我在SO上找不到答案 我最终解决了它 我将发布我的答案 看看人们是否愿意发表评论或提供更好的答案 这是一个基本大纲 我想在本周晚些时
  • 局部变量和全局变量默认是如何初始化的?

    根据以下内容 我对吗 global A 引用被初始化为 null global int 为 0 local A 引用为空 local int 未初始化 global A x 和 local A x 均未初始化 谢谢你的帮助 A global
  • 如何在 IDE 中使用 Grails 依赖项

    So I finally https stackoverflow com questions 1867064 grails and local maven dependencies让我的依赖项与 Grails 一起工作 现在 我的 IDE
  • 如何创建行列总和为 1 和 0 的对称矩阵

    我试图找到一种优雅的算法来创建 1 和 0 的 N x N 矩阵 但有以下限制 每行每列之和必须为Q 可自由选择 对角线必须是 0 矩阵必须是对称的 矩阵不一定是随机的 然而 随机和非随机解都很有趣 因此对于 Q 偶数 只需使每一行成为向量
  • Spring验证字符串值是JSON

    我的配置文件中有一些值 它应该是 JSON 它将作为字符串加载 我希望 Spring 在注入之前验证该值确实是有效的 JSON 否则会抛出错误 我已经阅读了现有的验证注释 例如 NotNull Size Min Max Email NotE