我们可以使用bean验证轻松验证JAX-RS资源类字段或方法参数,如下所示:
@Size(min = 18,max = 80,message =“年龄必须介于{min}和{max}之间。”)字符串年龄;
将错误消息绑定到JSP页面的最简单方法是什么?
(比方说,我正在使用带有Jersey或Resteasy的Java EE 7)
答案 0 :(得分:18)
编辑1
我们在Jersey 2.3中引入了新的注释@ErrorTemplate,涵盖了这个用例。 Handling JAX-RS and Bean Validation Errors with MVC更深入地描述了它,并展示了如何使用它。
使用Jersey,您可以按照以下步骤操作:
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 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,您将处理所有抛出的ConstraintViolationExceptions,最终响应将具有HTTP 400
响应状态。传递给{({3}})的实体将由来自jersey-mvc
模块的MessageBodyWriter处理,它基本上将输出已处理的JSP页面。 Viewable类的第一个参数是JSP页面的路径(您可以使用相对路径或绝对路径),第二个参数是JSP将用于呈现的模型(模型可以通过JSP中的${it}
属性访问) 。有关此主题的更多信息,请参阅泽西用户指南中有关Viewable的部分。
您需要做的最后一步是将您的提供商注册到MVC(我将使用来自Jersey的Application向您展示一个扩展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);