[技术交流] 基于继承或实现方式使用Validator的问题

如果是基于接口或实现的方式,一个参数校验不通过,会出现两条校验失败的信息,一个是接口的,一个是实现类的

public interface ISimpleCtrl {


    String getName(@Min(10) int age);

}


@RestSchema(schemaId = "Simple")

@RequestMapping(path = "/simple")

public class SimpleCtrlImpl implements ISimpleCtrl {


    @GetMapping(path = "/getname")

    @Override

    public String getName(@Min(10) int age) {

        return "This name: " + age;

    }


}


错误:

{

    "message": "[ConstraintViolationImpl{interpolatedMessage='最小不能小于10', propertyPath=getName.age, rootBeanClass=class com.service.comment.controller.SimpleCtrlImpl, messageTemplate='{javax.validation.constraints.Min.message}'}, ConstraintViolationImpl{interpolatedMessage='最小不能小于10', propertyPath=getName.arg0, rootBeanClass=class com.service.comment.controller.SimpleCtrlImpl, messageTemplate='{javax.validation.constraints.Min.message}'}]"

}


原因:

hibernate validator在校验时,会把所有的父类、接口和自己的方法都一起校验,所以接口和自身的方法都会去校验

我们实现的获取接口参数还是返回arg0 arg1这种,实现类获取的是真实的参数

以前老的没问题是因为接口和参数都返回相同时,只取了一个。

public void markConstraintProcessed(Object bean, Path path, MetaConstraint<?> metaConstraint) {

// TODO switch to proper multi key map (HF)

BeanAndPath beanAndPath = new BeanAndPath( bean, path );

if ( processedMetaConstraints.containsKey( beanAndPath ) ) {

processedMetaConstraints.get( beanAndPath ).add( metaConstraint );

}

else {

IdentitySet set = new IdentitySet();

set.add( metaConstraint );

processedMetaConstraints.put( beanAndPath, set );

}

}


解决方法: 只在接口上面定义,不要在实现类上定义,以免造成重复。(因为接口没定义,实现上定义,hibernate会报错。。。)