将 JAX-RS bean 验证错误消息绑定到视图

2023-11-27

我们可以使用 bean 验证轻松验证 JAX-RS 资源类字段或方法参数,如下所示:

@Size(min = 18, max = 80, message = "年龄必须在 {min} 和 {max} 之间。") String Age;

将错误消息绑定到 JSP 页面的最简单方法是什么?

(假设我正在使用 Java EE 7 和 Jersey 或 Resteasy)


EDIT 1

我们引入了新的注释@错误模板Jersey 2.3 中涵盖了这个用例。使用 MVC 处理 JAX-RS 和 Bean 验证错误更深入地描述它并展示如何使用它。


使用 Jersey,您可以按照以下步骤操作:

  1. 添加以下依赖项:jersey-bean-validation and jersey-mvc-jsp
  2. 创建一个异常映射器 for 约束违反异常
  3. 注册您的提供商

依赖关系

如果您使用 Maven,您只需将这些依赖项添加到您的pom.xml

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-mvc-jsp</artifactId>
    <version>2.1</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-bean-validation</artifactId>
    <version>2.1</version>
</dependency>

否则请参阅模块依赖项页面以获取所需库的列表(球衣-MVC-jsp and 泽西岛 bean 验证).

异常映射器

当验证实体(或 JAX-RS 资源)期间出现问题时,Bean Validation 运行时会抛出 ConstraintViolationException。 Jersey 2.x提供了一个标准的ExceptionMapper来处理此类异常(ValidationException准确地说)所以如果你想以不同的方式处理它们,你需要编写自己的 ExceptionMapper:

@Provider
@Priority(Priorities.USER)
public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    @Override
    public Response toResponse(final ConstraintViolationException exception) {
        return Response
                // Define your own status.
                .status(400)
                // Put an instance of Viewable in the response so that jersey-mvc-jsp can handle it.
                .entity(new Viewable("/error.jsp", exception))
                .build();
    }
}

使用上面的 ExceptionMapper,您将处理所有抛出的 ConstraintViolationException,最终响应将具有HTTP 400响应状态。实体通过(Viewable) 的响应将由 MessageBodyWriter 处理jersey-mvc模块,它基本上会输出一个处理过的 JSP 页面。 Viewable 类的第一个参数是 JSP 页面的路径(可以使用相对或绝对路径),第二个参数是 JSP 将用于渲染的模型(该模型可通过${it}JSP 中的属性)。有关此主题的更多信息,请参阅有关MVC在泽西岛用户指南中。

注册提供商

您需要做的最后一步是将您的提供商注册到您的应用(我将向您展示一个使用的示例资源配置来自 Jersey,它扩展了应用程序类):

new ResourceConfig()
    // Look for JAX-RS reosurces and providers.
    .package("my.package")
    // Register Jersey MVC JSP processor.
    .register(JspMvcFeature.class)
    // Register your custom ExceptionMapper.
    .register(ConstraintViolationExceptionMapper.class)
    // Register Bean Validation (this is optional as BV is automatically registered when jersey-bean-validation is on the classpath but it's good to know it's happening).
    .register(ValidationFeature.class);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JAX-RS bean 验证错误消息绑定到视图 的相关文章

随机推荐

  • Firebase Cloud Firestore 触发器 context.auth 始终为 null [重复]

    这个问题在这里已经有答案了 我正在使用 Firebase 和 Cloud Firestore 构建一个群组应用程序 用户应该能够在其中创建群组并向其中添加成员 当用户创建组时 我希望云触发器在创建组后将该用户添加到组的成员列表中 触发器看起
  • Android 支持的语言/区域设置列表是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道如何为不同语言的文件夹命名 在哪里可以找到 Android 支持的语言列表 自 Android 5 1 起更新的列表 af Afrikaan
  • 无法更改 pty/N 上的终端大小(适用于 ttyN)

    我使用 next 来更改终端大小 rc ioctl fd TIOCSWINSZ ws 当我在 Linux 文本终端下运行这个 通过 Alt Ctrl F1 切换 时 结果是我期望看到的 我的整个输入和输出都在 ioctl 系统调用给出的范围
  • 如何将导航抽屉放在工具栏下方?

    我的导航抽屉位于工具栏上方 我还添加了一些 xml 代码 请帮助我 这是我的 Activity xml
  • 替换 BLOB 列中的文本

    在我们的一张桌子上有一个HUGEBLOB列 列名称是DYNAMIC DATA 其中包含 XML 数据 我需要做的是更新此 BLOB 中文本的特定部分 我尝试过这个查询 UPDATE ape1 item version SET DYNAMIC
  • 为什么 NetBeans 在 OS X 上运行我的程序,但不将其构建到 JAR 中?

    tl dr 我缺少什么依赖项 允许 NetBeans 在内部正常运行 OS X 集成程序 但无法清理并将其构建为 JAR 我正在尝试制作一个集成到 OS X 中的 Java 程序 但我希望也将其发布到 Windows 和 Linux 上 为
  • 如何从 Maven Reactor 构建中排除模块?

    我们有一个 Maven 2 项目 其中有很多模块 例子
  • 任务“:app:validateSigningRelease”执行失败。颤振误差

    我想发布我的应用程序 但遇到了这个问题 FAILURE Build failed with an exception What went wrong Execution failed for task app validateSigning
  • NSPredicate 未执行

    这很有趣 在我的应用程序中 我在数据库中创建了数千个条目 在另一个线程中 我使用 MagicalRecord 一切似乎都工作正常 从背景 前景 上下文的角度来看 当我在主线程中尝试获取 刚刚插入 的数据时 我发现了以下行为 NSArray
  • 从 edittext 中选定的文本中删除样式

    我的应用程序应该允许用户在 Edittext 中设置输入或选定文本的样式 其中一些样式有下划线 删除线 粗体和斜体 它们很容易添加 但我不知道如何将它们移除 and 我如何确定该样式是否已添加到选定的文本 添加样式的代码 Spannable
  • 内置赋值运算符的返回类型是什么?

    我刚刚开始 C 我对赋值和取消引用运算符的返回类型有点困惑 我正在关注 C Primer 这本书 在各种场合 作者都说赋值运算符的返回类型是对左手操作数类型的引用 但后来 他说返回类型是左手操作数的类型 我已经提到了 C 11 Standa
  • PHP-获取数组值的键名

    我有一个数组如下 function example some stuff here that pushes items with dynamically created key strings into an array return ar
  • 最佳实践:Android 上的布局(编程与 XML)

    这个问题已经困扰我一段时间了 我已经在 Android 平台上开发了几个应用程序 并且总是发现自己求助于 Java 代码来构建布局 在专业的开发环境中 这是可以接受的吗 或者 XML 文件应该成为首选方法 我通常发现 XML 是一种更乏味的
  • 如何在同一个 Ruby Rails 项目中配置 MongoMapper 和 ActiveRecord

    我有一个现有的生产 Ruby Rails 应用程序 我希望在时间允许的情况下将其迁移到 MongoDB 因为不能一次性全部重写 我希望能够在我接触到旧课程时就弃用它们 我打算使用 MongoMapper 我找不到任何人解释如何设置数据库配置
  • com.firebase.client.FirebaseException:无法解析类为 CLASS_NAME android 的节点

    我在使用 Firebase 更新现有值时遇到以下异常updateChildren方法 com firebase client FirebaseException Failed to parse node with class class c
  • 如何开始使用 Java 构建 Web 应用程序? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想开始使用 java 进行 Web 开发 不知道如何开始 该学什么 或者什么是最好学习和使用的 Web 框架 帮帮我 我假设您只是 Web 应用程序的新手 而不是 Java 本
  • 超类中的私有方法可以在子类中重写吗?

    Java中私有方法可以被重写吗 如果不是 那么下面的代码如何工作 class Base private void func System out println In Base Class func method class Derived
  • 如何解决UITableView滚动缓慢的问题

    我是第一次在真实设备上进行测试 在修复了一些明显的性能问题后 我陷入了如何平滑滚动的困境 这就是我所做的 数据在sqlite中 我有一个带有标题的小数组 我在每个标头数组中都有来自数据库的 Id 列表 e g 标头 A Id 1 2 标头
  • 我可以替换 Java 正则表达式中的组吗?

    我有这段代码 我想知道是否可以仅替换 Java 正则表达式中的组 而不是所有模式 代码 Pattern p Pattern compile d d String input 6 example input 4 Matcher m p mat
  • 将 JAX-RS bean 验证错误消息绑定到视图

    我们可以使用 bean 验证轻松验证 JAX RS 资源类字段或方法参数 如下所示 Size min 18 max 80 message 年龄必须在 min 和 max 之间 String Age 将错误消息绑定到 JSP 页面的最简单方法