gpt4 book ai didi

java - 接收参数的 CDI 验证

转载 作者:行者123 更新时间:2023-11-29 07:14:11 25 4
gpt4 key购买 nike

我正在尝试了解 CDI,但目前结果很少。 :(实际上,我被这个例子这样的 web 服务门面所困扰:

@GET
@Path("/greeting/{name}")
@produces(mediatype.text_plain)
public String sayHello(@PathParam("name") String name)
{
return "Hello " + name;
}

因为使用 CDI 注释,所以我想在每次将字符串作为参数发送时在服务器端进行检查,以得到类似的结果:(注意 @NameValidator 注释)

@GET
@Path("/greeting/{name}")
@Produces(mediatype.text_plain)
public String sayHello( @NameValidator @PathParam("name") String name)
{
return "Hello " + name;
}

验证可以是任何类似的东西,在外部类中:

if (name == "Andrea") {
throw new Exception();}

它是如何工作的?是否可以?如果没有,有哪些替代方案?谢谢你!安德里亚

最佳答案

你可以使用 CDI's interceptor annotations并做类似的事情:

...
@Validated
public String sayHello(@Validator(MyValidator.class) String name) {
...

在哪里@Validated将方法绑定(bind)到 ValidationInterceptor类左右,你在哪里使用 @AroundInvoke方法及其InvocationContext参数来检查传递的参数并验证它们。

这种方法的一个“困难”是您必须使用反射来获取 @Validator。注释并为每个参数指定 validator 类,然后在最终进行实际验证之前创建/检索相应的实例。

一个稍微不同的方法是注入(inject)一个 Instance<T> validator 的通用父类(super class)/接口(interface)到 ValidationInterceptor并注释 sayHello带有 validator 限定符的参数:

// in ValidationInterceptor:

@Inject
private Instance<Validator> validatorInstance;

@AroundInvoke
public Object validate(InvocationContext context) {

// get Annotation instances for target method parameters
// ...

Validator validator =
validatorInstance.select(annotations).get();

// ... validator.validate(parameter); ...

}

// sayHello:

...
@Validated
public String sayHello(@NameValidator String name) {
...

InvocationContext获取参数注释,做类似的事情:

Annotation[][] annotations = context.getMethod().getParameterAnnotations();

您还可以考虑在 @AfterBeanDiscovery 中预处理这些注释事件处理程序。

关于java - 接收参数的 CDI 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11156836/

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