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

时间:2013-08-02 11:20:11

标签: java-ee jersey jax-rs resteasy bean-validation

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

@Size(min = 18,max = 80,message =“年龄必须介于{min}和{max}之间。”)字符串年龄;

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

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

1 个答案:

答案 0 :(得分:18)

编辑1

我们在Jersey 2.3中引入了新的注释@ErrorTemplate,涵盖了这个用例。 Handling JAX-RS and Bean Validation Errors with MVC更深入地描述了它,并展示了如何使用它。


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

  1. 添加以下依赖项:jersey-bean-validationjersey-mvc-jsp
  2. ExceptionMapper
  3. 创建ConstraintViolationException
  4. 注册您的提供商
  5. 依赖关系

    如果您正在使用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)。

    ExceptionMapper

    在验证实体(或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);
    
相关问题