【问题标题】:How to validate website URL field of an JPA entity?如何验证 JPA 实体的网站 URL 字段?
【发布时间】:2017-08-30 21:23:14
【问题描述】:

我有一个代表公司的 JPA 实体。它有一个代表公司网站 URL 的字段。在持久化之前,我需要验证该 URL 是一个有效的网站 URL。我想只有以 http 或 https 开头的 URL 才是有效的网站 URL。我该如何执行?我用的是最新的。将 Hibernate 版本作为我的 JPA 提供程序。

【问题讨论】:

  • 为了更好地说明:JPA 注释在数据(模型)上。应在 GUI 层上看到验证的实时效果。有些东西必须将两者联系起来。最好是使用完整的框架(网络应用程序的网络框架),而不是“手动”代码,
  • JPA 与 Bean 验证无关。那就是 Bean Validation API

标签: java hibernate validation bean-validation


【解决方案1】:

@dimitrisli 建议您一个正确的解决方案。您应该使用@URL 约束。如果你想允许一个特定的协议 - 这个约束有一个 protocol 属性:

@URL(protocol = "http")
private String companyUrl;

此外,还有一个 regexp 属性,您可以使用它来使您的网址匹配您想要的任何模式。

    @URL(regexp = "^(http|ftp).*")
    private String companyUrl;

您可以在doc 中查看更多详细信息(在链接部分查找 URL)。

此外,如果您想使用 URL 代替 String,您可以为 URL 类和 URL 约束编写自己的验证器实现,但请注意,如果您尝试创建无效的 @987654332 @ 它会在创建过程中失败,而不是在验证时失败。所以为URL 写一个验证器可能只有当你想检查协议和类似的东西时才有意义。

要编写自己的验证器,您需要实现

public class URLValidator implements ConstraintValidator<org.hibernate.validator.constraints.URL, URL> {
...
}

更多详情请查看this 博文。

【讨论】:

  • 正则表达式对我不起作用。如果我使用 regexp = "^(http|https)" 针对 URL 验证器验证 google.com,验证失败。
  • 对...这是因为它试图将该表达式与 String 值匹配,并且在您的谷歌情况下 - 它不是从协议开始的。 .. 但是它是一个有效的 URL 吗? (我的意思是如果它没有协议)
  • 我想通了。这是因为正则表达式匹配整个字符串,而不仅仅是 sibstring 的出现。我需要添加 .* 使得 regexp = "^(http|https).*"
【解决方案2】:

看看Hibernate Validator的@URL注解。

【讨论】:

  • 谢谢。这意味着我需要将网站 URL 字段表示为“字符串”而不是“java.net.URL”。我想那没关系。但是如何指定多个协议,例如“http”和“https”。 '@URL' 'protocol' 属性只需要一个'String'。不要认为我应该允许“file”、“ftp”等协议。
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多