jakarta-ee - 我可以使用 apache wink (JAX/RS) 实现 Hibernate (JSR 303) 方法验证吗

标签 jakarta-ee jax-rs bean-validation hibernate-validator apache-wink

我目前正在研究使用 hibernate 验证器支持使用 JSR 303 注释进行方法验证。最初尝试使用执行验证的代理(使用 cglib 生成)包装资源,但是,这似乎已经走到了死胡同,因为我尝试过的代理方法似乎没有复制参数注释,所以依赖于此的资源方法最终会在没有参数的情况下被调用。我现在还有另一个关于该项目的问题:

How can I create a dynamic proxy in java that retains parameter annotations on methods?

是否有替代机制可以在不使用代理的情况下连接到 wink 的请求链来执行此类操作?

最佳答案

您可以通过创建 RequestHandler 来实现这一点,这是一种部分受支持的方式,并覆盖实际的 HandlersFactory返回包含您的请求处理程序的列表。对此的配置进行了讨论 here .此请求处理程序将直接插入到 InvokeMethodHandler 之前的请求处理链中(这是调用的最后一个请求处理程序,这是实际调用资源方法的那个)。

基于阅读 InvokeMethodHandler 的源代码(实际上是调用你的JAX/RS资源),你可以获取参数、实例和方法参数如下:

   // Get Method Validator from hibernate 
   MethodValidator validator = Validation.byProvider(HibernateValidator.class).configure()
            .buildValidatorFactory().getValidator().unwrap(
                    MethodValidator.class);

    // Extract the method parameters, object instance and method metadata from the JAX/RS internals.
    Method javaMethod = null;
    Object instance = null;
    Object[] parameters = null;
    SearchResult searchResult = context.getAttribute(SearchResult.class);

    javaMethod = searchResult.getMethod().getMetadata()
            .getReflectionMethod();

    parameters = searchResult.getInvocationParameters();
    instance = searchResult.getResource().getInstance(context);

    // Use all this to perform validation...
    Set<MethodConstraintViolation<Object>> violations = validator
            .validateAllParameters(instance, javaMethod, parameters);
    if (!violations.isEmpty()) {
         // do something with the violations here 
    }

这有点 hacky,因为它依赖于(据我所知未记录)wink 的实现细节来获取实例、参数和元数据(如果他们提供一种公共(public)方式来获取此信息,那就太好了).但是,它比使用代理更可取,因为您不会从代理发生的反射中推断出多个开销。

关于jakarta-ee - 我可以使用 apache wink (JAX/RS) 实现 Hibernate (JSR 303) 方法验证吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6948427/

相关文章:

JavaFX : Update UI label asynchronously with messages while application different methods execution

cxf - 没有消息正文作者/JAX-RS/CXF

java - Gzip 格式解压缩 - Jersey

java - Springfox Bean Validations @Size 注释在列表上无法正常工作

java - 仅当不为空或零时,如何 java bean 验证范围

spring - Bean 验证 - 验证可选字段

java - 如何将动态 Web 应用程序转换为 war

java - 关于 Java 指针和更改 JSF 应用程序中的语言环境的基本知识

java - 在 Spring 中注入(inject) EJB

java - Jersey:JSON 和 StringMessageProvider 冲突,application/json 方法生成无效的 JSON