经过大量的冲浪,在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得到了预期的响应。但是,验证器没有被解雇。那是肯定的。我已经使用了System.outs,断点等。这只是没有发生。
一个消息来源说要创建一个@Configuration类,并向其添加一个@Bean getter,它返回一个ValuesValidatorImpl对象。试过了,没有用。我也将它添加到了我的applicationContext.xml文件中也声明的component-scan包中。
有人建议吗? “在示例中效果很好”,这次似乎似乎没有发生。
更新:我将问题发布到了Jetty用户列表中,一名成员要求提供该问题的示例实现。在Github上,所以我有义务。要重现问题行为,请参阅:
https://github.com/mcc99/samples/tree/master/customer-validator
由IntelliJ IDEA社区开发,并包含一个Maven .pom文件,可轻松进行依赖项检查和检索。
在此先感谢您对本问题的任何轻描淡写。我很难相信这是一个尚未浮出水面的问题,所以我不得不想象自己做错了什么/缺少了什么。另请注意,我尝试了最新版本。码头的问题,行为仍在继续。
答案 0 :(得分:1)
您必须在目标bean上添加注释@Validated。
import org.springframework.validation.annotation.Validated;
//..
@Component
@Validated
public class GetValuesImpl implements IGetValues {
否则,此bean将不会附加您提供的自定义验证。