7

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

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

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

(比如说,我正在使用带有 Jersey 或 Resteasy 的 Java EE 7)

4

1 回答 1

18

编辑 1

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


使用泽西岛,您可以按照以下步骤操作:

  1. 添加以下依赖项:jersey-bean-validationjersey-mvc-jsp
  2. ConstraintViolationException创建一个ExceptionMapper
  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>

否则请参阅模块依赖页面以获取所需库的列表(jersey-mvc-jspjersey-bean-validation)。

异常映射器

当验证实体(或 JAX-RS 资源)期间出现问题时,Bean 验证运行时会引发 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,您将处理所有抛出的 ConstraintViolationExceptions,最终响应将具有HTTP 400响应状态。传递给响应的实体(Viewable)将由jersey-mvc模块中的 MessageBodyWriter 处理,它基本上会输出一个处理后的 JSP 页面。Viewable 类的第一个参数是 JSP 页面的路径(可以使用相对路径或绝对路径),第二个参数是 JSP 将用于呈现的模型(模型可通过${it}JSP 中的属性访问)。有关此主题的更多信息,请参阅Jersey 用户指南中有关MVC的部分。

注册提供者

您需要做的最后一步是将您的提供程序注册到您的应用程序中(我将向您展示一个使用来自 Jersey的ResourceConfig扩展 Application 类的示例):

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);
于 2013-08-02T13:03:47.730 回答