gpt4 book ai didi

java - 未执行自定义约束 validator 注释

转载 作者:行者123 更新时间:2023-12-05 05:14:51 25 4
gpt4 key购买 nike

经过大量的冲浪、查看此处的 SO、阅读文章并尝试许多事情之后,出于某种原因,我在基于 Spring 的 Web 服务应用程序中的自定义约束没有触发。我似乎无法弄清楚这一点,所以我正在对观众进行投票。

我正在使用 Jetty 9.2.2.v20140723。 Spring 4.3.13,Hibernate 5.3.0-FINAL。以下是我的文件。在这一点上,我正在尝试实现交叉参数验证。这个例子很简单:如果两个参数不相等,则验证失败。文件:

package com.xxx.yyy;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import com.xxx.validator.ValuesValidator;

public interface IGetValues {

@Path("/{value1}/{value2}")
@GET
@ValuesValidator
public MyResponse getValues(@PathParam("value1") String value1, @PathParam("value2") String value2);

}

下一步:

package com.xxx.yyy;

import org.springframework.stereotype.Component;
import com.xxx.validator.ValuesValidator;

@Component
public class GetValuesImpl implements IGetValues {

@Override
@ValuesValidator
public MyResponse getValues(String value1, String value2) {
return new MyResponse();
}
}

下一步:

package com.xxx.yyy.validator;

import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;


@Target({METHOD, CONSTRUCTOR, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = ValuesValidatorImpl.class)
@Documented
@SupportedValidationTarget(ValidationTarget.PARAMETERS)

public @interface ValuesValidator {
String message() default "The two values don't match";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

下一步:

package com.xxx.yyy.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;


@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class ValuesValidatorImpl implements
ConstraintValidator<ValuesValidator, Object[]> {

@Override
public void initialize(ValuesValidator valuesValidator) {

}

@Override
public boolean isValid(Object[] values, ConstraintValidatorContext constraintValidatorContext) {

String val1 = (String) values[0];
String val2 = (String) values[1];

return val1.equals(val2);
}
}

我正在使用 PostMan 获取 URL:

http://localhost:9086/path/v1/values/A/B

因为“A”不是“B”,我应该抛出一个验证异常和某种“You Suck!”回码。运气不好。

服务被调用得很好,我从 MyResponse 得到了预期的响应。但是 validator 没有被解雇。这是肯定的。我使用了 System.outs、断点等。它只是没有发生。

一个消息来源说要创建一个@Configuration 类并向其添加一个返回ValuesValidatorImpl 对象的@Bean getter。试过了,没用。我将它添加到也在我的 applicationContext.xml 文件中声明的组件扫描包中。

大家有什么建议吗? “它在示例中运行良好”这次似乎并没有发生在这里。

更新:我将我的问题发布到 Jetty 用户列表,一位成员要求提供该问题的示例实现。在 Github 上,所以我有义务。要重现问题行为,请参阅:

https://github.com/mcc99/samples/tree/master/customer-validator

使用 IntelliJ IDEA Community 开发并包含一个 Maven .pom 文件,以便于检查和检索依赖项。

提前感谢您决定就此问题采取的任何措施。我很难相信这是一个现在还没有浮出水面的问题,所以我不得不想象我做错了什么/遗漏了什么。另请注意,我已经尝试过最新版本。 Jetty 和问题行为继续存在。

最佳答案

您必须在目标 bean 上添加注解 @Validated。

import org.springframework.validation.annotation.Validated;

//..
@Component
@Validated
public class GetValuesImpl implements IGetValues {

否则,此 bean 将不会附加您提供的自定义验证。

关于java - 未执行自定义约束 validator 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52208738/

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