您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“javax.validation結合spring的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“javax.validation結合spring的示例分析”這篇文章吧。
JSR303 是一套JavaBean參數校驗的標準,它定義了很多常用的校驗注解,我們可以直接將這些注解加在我們JavaBean的屬性上面,就可以在需要校驗的時候進行校驗了。
注解如下:
Hibernate validator 在JSR303的基礎上對校驗注解進行了擴展,擴展注解如下:
<!--jsr 303--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <!-- hibernate validator--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.0.Final</version> </dependency>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
這里使用的Lombok獲取get和set,使用的@Getter注解
@AllArgsConstructor 這個注解是lombok中為類提供一個全參的構造方法
package com.alibaba.xianzhi.validator; import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Getter; /** * Created by Jackielee on 2017 * @author: lizhilong * @date: 2017-11-14 18:01:34 */ @Getter @AllArgsConstructor public class Violation implements Serializable { private static final long serialVersionUID = -1731546219600067986L; private final String message; private final Object bean; private final String property; private final Object value; }
后面會說這個類的用法
package com.alibaba.xianzhi.validator; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.commons.collections.CollectionUtils; /** * @author: lizhilong * @date: 2017-11-15 11:41:12 */ @AllArgsConstructor public class ViolationBuild{ @Getter private Set<Violation> violations; public String getMessage() { List<String> list = new ArrayList<String>(); for (Violation violation : violations) { list.add(violation.getMessage()); } return list.size() > 0 ? list.get(0) : ""; } public static <T> ViolationBuild build(Set<ConstraintViolation<T>> cvs) { Set<Violation> result = new HashSet<Violation>(); if (CollectionUtils.isNotEmpty(cvs)) { for (ConstraintViolation cv : cvs) { result.add(new Violation(cv.getMessage(), cv.getRootBean() == null ? null : cv.getRootBean().toString(), cv.getPropertyPath() == null ? null : cv.getPropertyPath().toString(), cv.getInvalidValue())); } } return new ViolationBuild(result); } }
package com.alibaba.xianzhi.validator; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.ValidationException; import javax.validation.Validator; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author: lizhilong * @date: 2017-11-15 11:40:59 */ @AllArgsConstructor @Getter public class ValidatorProvider { private final Validator validator; public <T> ViolationBuild validate(T object) { Set<ConstraintViolation<T>> violations; try { violations = validator.validate(object); } catch (IllegalArgumentException iae) { throw iae; } catch (ValidationException ve) { throw ve; } return ViolationBuild.build(violations); } public <T> ViolationBuild validate(T object, Class<?>... groups) { Set<ConstraintViolation<T>> violations; try { violations = validator.validate(object, groups); } catch (IllegalArgumentException iae) { throw iae; } catch (ValidationException ve) { throw ve; } return ViolationBuild.build(violations); } public <T> ViolationBuild validateProperty(T object, String propertyName, Class<?>... groups) { Set<ConstraintViolation<T>> violations; try { violations = validator.validateProperty(object, propertyName, groups); } catch (IllegalArgumentException iae) { throw iae; } catch (ValidationException ve) { throw ve; } return ViolationBuild.build(violations); } public <T> ViolationBuild validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) { Set<ConstraintViolation<T>> violations; try { violations = validator.validateValue(beanType, propertyName, value, groups); } catch (IllegalArgumentException iae) { throw iae; } catch (ValidationException ve) { throw ve; } return ViolationBuild.build(violations); } }
java不能多繼承 所以如果已經繼承了別的類,可以將此類注入出來
此類是為了拿到一個單例的ValidatorProvider
package com.alibaba.xianzhi.base.web; import javax.annotation.Resource; import javax.validation.Validator; import com.alibaba.xianzhi.validator.ValidatorProvider; /** * BaseService * @author: lizhilong * @date: 2017-11-15 11:41:24 */ public abstract class BaseService { @Resource protected Validator validator; private ValidatorProvider validatorProvider; protected ValidatorProvider getValidatorProvider() { if (validatorProvider == null) { validatorProvider = new ValidatorProvider(validator); } return validatorProvider; } }
說明:Constants為接口常量
@Getter @AllArgsConstructor public class SubmitVO extends BaseVO { @NotNull(message="廠商不能為空") private Long companyId; @Length(min=0, max=100, message="標題請控制在" + Constants.MAX_TITLE + "個字符以內") @NotNull(message="標題不能為空") private String title; @Length(min=0, max=65535, message="修復方案長度不能超過" + Constants.MAX_FIX_ADVICE) @NotNull(message="修復方案不能為空") private String fixAdvice; }
public BaseResponse save(SubmitVO submitVO ) { /** * getValidatorProvider()此方法是BaserService中, * 上面說到本人的service是繼承此 * service的所以可以直接用 **/ ValidatorProvider validatorProvider = getValidatorProvider(); /** * validatorProvider調用validate(Object obj)進行校驗 * 返回ViolationBuild **/ ViolationBuild validateFlaw = validatorProvider.validate(submitVO); /** * 此時如果校驗有失敗的 容器中便會存儲信息,ViolationBuild可以通過自己的 * getMessage方法獲取信息(此方法可以自己封裝成自己想要的樣子) **/ System.out.println(validateFlaw.getMessage()); }
打印結果:標題請控制在100個字符以內
以上是“javax.validation結合spring的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。