gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:28:54 24 4
gpt4 key购买 nike

我目前正在研究使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com