在Spring RabbitMQ项目中,我正在寻找一种以编程方式验证具有JSR303注释(如@NotNull, @Size等)的对象的方法,同时需要一些自定义验证逻辑。我通常会将ConstraintValidator与自定义注释结合使用,但是自定义注释的使用不是一个选项在本例中
我有以下(简化的)类,它是由Swagger生成的,因此不能被编辑:
@ApiModel(description="User")
public class User {
private String name;
@NotNull
@Size(min = 1, max = 6)
public String getName() {
return this.name;
}
...
}
附加的验证逻辑封装在验证器中:
@Component
public class UserValidator implements org.springframework.validation.Validator {
@Override
public boolean supports(Class<?> aClass) {
return User.class.equals(aClass);
}
@Override
public void validate(Object o, Errors errors) {
User user = (User) o;
...
if(!valid) {
errors.reject("some rejection");
}
}
}
发生验证的服务:
@Service
@RequiredArgsConstructor
public class SomeService {
private final javax.validation.Validator validator; // might as well be org.springframework.validation.Validator if that works better
public void someMethod(User user) {
if (!validator.validate(user).isEmpty()) {
// handle invalid user
}
...
}
}
然而,UserValidator没有被调用。有什么方法可以让Spring知道UserValidator
吗?我读过一些关于使用InitBinder的主题,但是因为这不是一个web MVC项目,而是一个rabbitMQ项目,我不确定这是否可以使用。
从您的描述中不清楚这是如何与Spring AMQP相关的,但是如果您想在侦听器方法级别上使用验证器,您应该分别配置它:
@Configuration
@EnableRabbit
public class Config implements RabbitListenerConfigurer {
...
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setValidator(new MyValidator());
}
}
查看文档获取更多信息:https://docs.spring.io/spring-amqp/docs/current/reference/html/#rabbit-validation