spring集成hibernate-validator後,使用校驗器第一次進行校驗時,由於需要初始化導致第一次調用耗時過長,rpc中校驗很可能導致調用超時,所以下面使用啓動時初始化來解決
spring集成hibernate-validator配置:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!--不設置則默認爲classpath下的 ValidationMessages.properties-->
<!--<property name="validationMessageSource" ref="validatemessageSource"/>-->
</bean>
掃描路徑下的class ,啓動時執行初始化方法
/**
* jsr-349校驗器
*/
@Autowired
private LocalValidatorFactoryBean localValidatorFactoryBean;
/**
* valid預加載
*/
@PostConstruct
public void valideBoost(){
scanFrom("需要掃描的包名");
scanFrom("com.xxx.order.trade.export.req");
}
/**
* 啓動加速!!!
* @param basePackage
*/
private void scanFrom(String basePackage){
int count=0;
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
final String resourcePattern = "/**/*.class";
String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(basePackage)
+ resourcePattern;
try {
Resource[] resources = resourcePatternResolver.getResources(pattern);
MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
for (Resource resource : resources) {
if (resource.isReadable()) {
MetadataReader reader = readerFactory.getMetadataReader(resource);
//掃描到的class
String className = reader.getClassMetadata().getClassName();
Class<?> clazz = Class.forName(className);
localValidatorFactoryBean.getConstraintsForClass(clazz);
count++;
}
}
} catch (Exception e) {
log.error("掃描包異常basePackage:{},e:{}",basePackage,e);
}
log.info("validator預加載:package:{},總數:{}",basePackage,count);
}