JSR-303 枚举字段的 Bean 验证

2024-01-26

我有一个简单的豆子enum field

public class TestBean{
   @Pattern(regexp = "A|B") //does not work
   private TestEnum testField;
   //getters + setters
}

enum TestEnum{
  A, B, C, D
}

我想验证testField使用 Bean 验证。具体来说,我想确保只允许 A 和 B 值(对于特定的校准组)。看来枚举没有被处理 JSR 303 (我试图使用 @Pattern 验证器)或者我正在以错误的方式做某事。

我遇到异常:

javax.validation.UnexpectedTypeException: No validator could be found for type: packagename.TestEnum

有没有办法在不编写自定义验证器的情况下验证枚举字段?


由于某些原因不支持枚举,因此可以通过简单的基于字符串的验证器来简单地处理此限制。

验证器:

/**
 * Validates a given object's String representation to match one of the provided
 * values.
 */
public class ValueValidator implements ConstraintValidator<Value, Object>
{
    /**
     * String array of possible enum values
     */
    private String[] values;

    @Override
    public void initialize(final Value constraintAnnotation)
    {
        this.values = constraintAnnotation.values();
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context)
    {
        return ArrayUtils.contains(this.values, value == null ? null : value.toString());
    }
}

界面:

@Target(value =
{
    ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER
})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy =
{
    ValueValidator.class
})
@Documented
public @interface Value
{
    public String message() default "{package.Value.message}";

    Class<?>[] groups() default
    {};

    Class<? extends Payload>[] payload() default
    {};

    public String[] values() default
    {};
}

验证器使用 apache commons 库。先进的强制类型方法将进一步增强该验证器的灵活性。

另一种方法可以使用单个字符串属性而不是数组并按分隔符分割。这也可以很好地打印错误消息的值,因为不会打印数组,但是使用以下方法处理空值可能会出现问题String.valueOf(...)

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

JSR-303 枚举字段的 Bean 验证 的相关文章

  • Java EE 身份验证:如何捕获登录事件?

    给定为 Java Web 应用程序定义的 FORM 类型的身份验证机制 如何捕获已执行登录在重定向到请求的资源之前发生事件 是否有任何类型的侦听器可以让我在用户登录时执行我的代码 我觉得定义过滤器不是最好的解决方案 因为过滤器链接到资源 即
  • JSP 中的 CDI 注入

    在 JSP 中 可以使用 EL 表达式 例如 myBean myAttribute 来使用 CDI 托管 Bean 这里没问题 我想在 JSP 文件中使用 常规注入 即不使用 EL 表达式 和 Inject 例如 然后是 即使该示例可以使用
  • 如何在JPA中反映“嵌套集”模型

    很好用嵌套集 http www evanpetersen com item nested sets html对于分层数据 但在这个设计中 如果删除或插入一些数据 您应该始终计算右侧和左侧节点 此外 您没有任何外键 我如何用 JPA 反映这个
  • JPA 2 - 外键仅包含复合主键中的一个字段?

    我在 JPA 2 Hibernate 中获取复合主键和外键时遇到问题 我正在尝试创建一个包含国家和省份的简单场景 国家实体 Entity Table name country public class Country extends Dom
  • java ee http-basic 身份验证错误页面

    使用 Java EE 中基于表单的身份验证来保护 Web 应用程序 我们可以指定登录和错误 html 页面 http docs oracle com javaee 5 tutorial doc bncbe html http docs or
  • jax-rs ContextResolver 理解

    但我试图了解 jax rs 中 Provider 的用法 但无法理解如何使用 ContextResolver 有人可以用一些基本的例子来解释这一点吗 您将看到它在解析序列化上下文对象时被大量使用 例如一个ObjectMapper用于 JSO
  • Wildfly Undertow 文件 Mimetypes

    我希望 Undertow 提供静态文件 如 jpg png js css txt 等 我在standalone xml中编辑了undertow子系统
  • request.getScheme() 返回 http 而不是在 java 中返回 https

    function demo request response request getScheme is returning http instead of returning https System out println request
  • 可以从自定义 LoginModule 访问远程 EJB 吗?

    我发现了一些关于如何编写自定义领域和登录模块的好提示 我想知道是否可以在自定义登录模块中访问远程 EJB 就我而言 我有远程 EJB 提供对用户实体的访问 通过 JPA 我可以使用它们吗 例如通过 EJB 注释 好吧 我自己找到了答案 工作
  • 属性编辑器未向 PropertyEditorManager 注册:自定义标记调用时出错

    调用我的时出现以下错误testtag jsp org apache jasper JasperException 无法将属性 att1 的字符串 转换为类 javax servlet jsp tagext JspFragment 属性编辑器
  • “@inject”-ed 属性保持为空

    我试图将服务注入到我的 bean 中 但它总是null 我收到以下错误 WELD 001000 根据基本 null 解析属性 userBean 时出错 一些代码片段 索引 xhtml
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • 如何将注销的用户重定向到 Java EE/JSF 中的主页? [复制]

    这个问题在这里已经有答案了 我需要只允许登录用户访问我的应用程序的大部分页面 我正在使用 JSF 2 开发 Java 企业应用程序 有谁知道我该怎么做 也许有一个配置文件 我在主页中有一个登录组件 我希望用户在单击页面上除少数项目之外的任何
  • JBAS014544:找不到带接口的 EJB

    我是 Java EE 新手 正在使用 JBoss 7 创建我的第一个项目 我的工作区中有一个 EAR 项目 一个 EJB 项目 WEB 项目和一个 JPA 项目 EJB 项目中创建的 ejb 想要使用 JPA 项目中创建的 ejb 一切都编
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • ProGuard 可以与 JavaEE 6 应用程序一起使用吗?

    我试图让 Proguard 混淆一个简单的 war 文件 根据文档 Proguard 处理 war 文件 但是当我尝试时我得到这个 Warning class WEB INF classes com corp gr t2b T2BChann
  • org.apache.derby.jdbc.ClientDriver 在哪里?

    我下载了jar包核心 Apache Derby 数据库引擎 还包括嵌入式 JDBC 驱动程序 10 9 1 0 http mvnrepository com artifact org apache derby derby 但那个罐子不包括
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN

随机推荐