我们可以使用 bean 验证轻松验证 JAX-RS 资源类字段或方法参数,如下所示:
@Size(min = 18, max = 80, message = "Age 必须在 {min} 和 {max} 之间。") String age;
将错误消息绑定到 JSP 页面的最简单方法是什么?
(比如说,我正在使用带有 Jersey 或 Resteasy 的 Java EE 7)
我们可以使用 bean 验证轻松验证 JAX-RS 资源类字段或方法参数,如下所示:
@Size(min = 18, max = 80, message = "Age 必须在 {min} 和 {max} 之间。") String age;
将错误消息绑定到 JSP 页面的最简单方法是什么?
(比如说,我正在使用带有 Jersey 或 Resteasy 的 Java EE 7)
编辑 1
我们在 Jersey 2.3 中引入了新的注释@ErrorTemplate来涵盖这个用例。使用 MVC 处理 JAX-RS 和 Bean 验证错误更深入地描述了它并展示了如何使用它。
使用泽西岛,您可以按照以下步骤操作:
jersey-bean-validation
和jersey-mvc-jsp
如果您使用的是 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-jsp和jersey-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);