Guia de pacotes e configuração
Importar pacotes JSR 303 e hibernar pacotes válidos
<Depencency> <Puerpid> org.hibernate.validator </proupId> <TRARFACTID> Hibernate-validador </stutifactId> <Version> 6.0.5.Final </sipers> </dependency> <pendency> <purbrougid> javax.validation </Groupid> <Tifactid> Vididation-Api </ArtStx. <Versão> 2.0.0.Final </sisters> </dependency>
Configuração do Springboot
Recursos/Application.yml Message Recurso Arquivo Configuração de Processamento Internacional
primavera:
mensagens:
Nome da base: base, TODO # Recursos Base.properties and Todo.properties, separados por vírgulas
Codificação: UTF-8 # Parsing A codificação deve ser especificada, caso contrário, o código ilegal chinês
Configure na aula de inicialização de trampolim
@SpringbooTapplicationPublic Class Aplicativo estende WebMVCConfigureRAdApter {@Value ("$ {spring.messages.baseName}") private string Basename; public static void main (string [] args) {springApplication.run (Application.class, args); } @Bean @Primary Public MessageSource MessageRce () {ResourceBundLemessagesource ResourceBundLemessagesource = new ResourceBundLemessagesource (); ResourceBundLemessagesource.SetUseCODEASDefaultMessage (false); ResourceBundLemessagesource.SetDefaultEncoding ("UTF-8"); // Repita a definição ResourceBundLemessagesource.setBaseNames (Basename.split (",")); retornar resourcebundLemessagesource; } @Bean @Primary Public LocalValidatorFactoryBean Validator () {localValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean (); validatorFactoryBean.SetProviderClass (HibernateValidator.class); validatorFactoryBean.SetValidationMessagesource (MessageRce ()); retornar validatorFactoryBean; } @Override Public Validator getValidator () {return valdalator (); } / *** A verificação de parâmetros única no nível do método está ativada* / @Bean Public MethodValidationPostProcessor MethodValidationPostProcessor () {return new MetodValidationPostProcessor (); }}Processamos exceções que não podem passar nos parâmetros de verificação e não podem passar pelo arremesso, que é através da captura de exceção unificada.
@Controleradvice @componentPublic Classe bindValidexceptionHandler {@Responsestatus (value = httpstatus.ok) @exceptionHandler (restrintviolationException.class) public @ResponseBody Msg HandleConstraintviolationException (RECHEFRIANTVIONCIONCIONCEXCIONCIONCIONAL E) {String MssageTemply = e.getConstraIntViOlations (). Iterator (). Next (). getMessageTemplate (); retornar msg.error (messageTemplate); } @Responsestatus (value = httpstatus.ok) @exceptionHandler (bindException.class) public @ResponseBody Msg handlebindexception (bindException e) {bindingResult bindingResult = e.getBindingResult (); String className = bindingResult.gettarget (). GetClass (). GetName (); FIELDERROR NEXT = BINDINGRESULT.GETFIELDERRORS (). Iterator (). Next (); String fieldName = next.getfield (); String defaultMessage = next.getDefaultMessage (); if (padrony.compile ("ilegalargumentException: sem enum"). Matcher (defaultMessage) .find ()) {Matcher Matcher = Pattern.compile ("para value '(.*?)'"). Matcher (defaultMessage); if (matcher.find ()) {defaultMessage = "O tipo enum não pode ser encontrado [" + matcher.group (1) + "]"; }} retornar msg.error (defaultMessage); } @Responsestatus (value = httpstatus.ok) @ExceptionHandler (ValidError.class) public @ResponseBody Msg HandleValidError (ValidError e) {return msg.error (e.getMessage ()); }}Recursos/Base.propertie
CreatorId = ID do criador não pode ser menor que {value}.
modifierId = ID do modificador não pode ser menor que {value}.
Recursos/TODO.Properties
TODO.privateid.min = ID privado não pode ser menor que {value}.
Use anotações no campo Bean, onde as interfaces C e S no grupo se referem à abreviação do controlador e serviço, que incluem a interface de inserção, interface de atualização, etc., que são todas as convenções personalizadas.
/*** ID privado é a chave estranha que representa várias tabelas, como tarefas de projeto/tarefas/riscos/problemas sem projeto/revisão de perguntas*/@min (value = 1, message = "{TODO.privateId.Min}", grupos = {c.insert.class, c.update.class,/s.InSert.class; */@Min (value = 1, message = "{CreativeId}", grupos = {s.Insert.class}) private Long CreatorId; verificação da camada de controle do controlador@validado@RestController@requestmapping ("TODO") Classe public TodOCOntroller {@AUTOWIDED Private ToDOSERVICE TODOSERCE; @GetMapping ("getVo") public msg getvo (@min (value = 1, message = "para fazer id não pode ser menor que 1.") @RequestParam (requerir = false, defaultValue = "0") longo id) {return this.todoservice.getvo (id); } @PostMapping ("Add") public msg add (@Validated ({c.insert.class}) TODO) {return this.todoserice.add (TODO); }}@Validated ({c.insert.class}) declara para permitir grupos de verificação na anotação do feijão, e outros grupos de verificação não executarão a verificação, que podem ser distinguidos para verificação separada.
Por exemplo, se não houver entidade e apenas um tipo de dados básico, ela poderá ser verificada, mas três condições precisam ser atendidas:
Verifique por você mesmo.
Verificação da camada de serviço AOP
Classe de ferramentas ValidUtil
Precisa ser digitalizado e registrado como um único caso por troca
@ComPonentPublic Classe ValidUtil {@AUTOWIRed Private Validator Validator; public <T> set <RestrintViolation <T>> Validar (objeto t, classe <?> ... grupos) {return valdalator.validate (objeto, grupos); } public <t> set <restrintiolation <t>> validateValue (classe <t> beantype, string propriedadeName, valor do objeto, classe <?> ... grupos) {return validator.validateValue (beantype, propriedadeName, valor, grupos); } / *** Verifique o parâmetro e retorne o primeiro erro de erro* @param t Objeto verificado* @param Grupos Grupo Verificado* @param <t> Tipo original antes da apagamento do objeto* @Return Primeiro erro* / public <T> void VidandReturnfirFirRortips (T, classe <? if (validate.size ()> 0) {restrintiolation <T> next = validate.iterator (). Next (); String message = next.getrootbeanClass (). GetName () + "-" + next.getPropertyPath () + "-" + next.getMessage (); lançar novo ValidError (mensagem); }} / *** Verifique o parâmetro e retorne o primeiro erro de erro* @param TargetClass O tipo de classe do objeto que é validado* @param fieldname nome que precisa ser validado* @param obj Valor de propriedade necessário* @param Group Group Group Group* @Param <T> Tipo original antes do objeto* @return Erropúria prompt* / public <t> obj, classe <?> ... grupos) {set <restrintiolation <t>> validate = validator.validateValue (TargetClass, FieldName, OBJ, Grupos); if (validate.size ()> 0) {string message = TargetClass.getName () + "-" + FieldName + "-" + validate.iterator (). Next (). getMessage (); lançar novo ValidError (mensagem); }}}Configuração da AOP
O principal princípio é usar o método de interceptação da AOP para executar parâmetros e obter anotações para parâmetros. Em seguida, use a classe de ferramentas para verificar os parâmetros. Se a verificação falhar, um erro personalizado será lançado diretamente e o erro personalizado foi processado globalmente.
@Aspecto @componentPublic Class ValidatorAop {@AUTOWIRED PRIVADO VALULUTIL ValidUtil; /*** Definir regras de interceptação: Interceptar todas as classes abaixo do pacote Com.Service, existem métodos com a anotação @Service. */ @PointCut ("Execução (*com.service ..*(..)) e @annotation (org.springframework.stereotype.service)") public void controlermethodPointCut () {}/ ***Implementação específica do interceptor*/ @around ("controlermethpointCut (** *** Você também pode escrever diretamente "Execução (* com.xjj .........)" nesse interceptador de objeto público (prosseguirjOinpoint pjp) {MethodSignature MethodSignature = (MethodSignature) pjp.getSignature (); Método Método = MethodSignature.getMethod (); Anotação [] [] argannotações = métodos.getParameterAnnoTations (); Objeto [] args = pjp.getargs (); para (int i = 0; i <args.length; i ++) {for (anotação anotação: argannotações [i]) {if (validado.class.isinstance (anotação)) {validado = (validado) anotação; Classe <?> [] Grupos = validado.value (); ValidUtil.ValidandReturnFirsterRortips (args [i], grupos); }} tente {return pjp.proeced (args); } catch (arremesso de arremesso) {throwable.printStackTrace (); } retornar true; }}Verifique a anotação @Min @NotNull Usage Method
Não pode ser escrito na classe de implementação, apenas anotações podem ser usadas na interface
Basicamente da mesma maneira que o controlador
@ValidatedPublic Interface TODOSERVICE { / *** Consulta TO-Do-Do* @param ID Número de série* @return TO-Do* / msg getvo (@min (value = 1, message = "TO-Do-do ID não pode ser menor que 1.") Long Id); / *** Adicione dados* @param todo objeto*/ msg add (@validado ({s.insert.class}) TODO);}Compartilhe algumas anotações de verificação personalizadas
Verificação nula de string
pacote javax.validation.Constrans; importar javax.validation.constraint; importar javax.validation.constraintValidator; importar javax.validation.ConstraIntValidatorContext; importação javax.Validation.Payload; import java.lang.annotation.*; Não pode ser usado e precisa ser reescrito. O pacote não pode ser alterado. */@Documentado@restrint (validadoBy = {notblank.notblankValidator.class})@Target ({ElementType.field, elementType.annotation_type, elementType.parameter})@retention (retentionPolicy.runtime) public @Interface NetBlank {Class) String message () padrão "{notblank}"; Classe <? estende a carga de pagamento> [] Payload () padrão {}; classe NotBlankValidator implementa restrintValidator <Notblank, object> {public NotBlankValidator () {} @Override public void Initialize (Notblank restantAnnotation) {} @Override boolean iSValid (valor do objeto, RECTRAINTVERCONTECTEXT (RETLUET TUBLEA! }}}Digite julgamento, para determinar se o tipo é um dos valores, você pode personalizar o julgamento com base no grupo de verificação
RECURSOS/TODO.PROPERTIESTODO.TODOTYPE.INSERT = Quando adicionado recentemente, o tipo de tarefa pode ser apenas uma das tarefas, tarefas de projeto ou problemas sem projeto. TODO.TODOTYPE.UPDATE = Ao modificar, o tipo de tarefa pode ser apenas um dos riscos e revisar os problemas de tarefa. bean/*** Todotype0Non-Projeto Task1Project Task2Problem3Risk4ReviewTODOTYPEVALID (Value = {"0", "1", "2"}, message = "{TODO.Todotype.Insert}, Groups = {c.Insert.Class, S.InSert.Cl. "4"}, message = "{tdo.todotype.update}", grupos = {c.update.class, s.Update.class}) private string Todotype;Anotações personalizadas
@Documented@Constraint(validatedBy = {TodoTypeValid.TodoTypeValidFactory.class})@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Repeatable(TodoTypeValid.List.class)public @interface TodoTypeValid {String message () padrão "Por favor, digite o tipo correto"; String [] value () padrão {}; Classe <?> [] Grupos () padrão {}; Classe <? estende a carga de pagamento> [] Payload () padrão {}; classe TODOTYPEVALIDFFACTORY IMPLEMPRANTEVERVALIDADOR <TODOTYPEVALID, String> {Private String [] AnoTationValue; @Override public void Initialize (TODOTYPEVALID TODOSTATUSVALID) {this.annotationValue = TODOSTATUSVALID.VALUE (); } @Override public boolean iSValid (Valor da String, RecheftValidatorContext Context) {if (Arrays.asList (AnoTationValue) .Contains (Value)) Retorne true; retornar falso; }} @Target ({elementType.field, elementType.annotation_type, elementType.parameter}) @retention (retentionPolicy.Runtime) @Documented @Interface List {ToDotyPevalid [] value (); }}@RePeatable (TodotyPevalid.list.class) é o mesmo recurso de anotação múltipla suportado pelo JDK8.
De acordo com o exposto, ele também pode ser usado nas classes de enumeração.
Quando Recursos/TODO.Propertiestodo.todostatus.insert = Adicionar ao novo, o status só não pode ser iniciado. Quando TODO.Todostatus.Update = é modificado, o status só pode estar em andamento ou concluído. bean/*** status todo 0 não iniciado 1 em andamento 2 concluído*/@TODOSTATUSVALID (enums = {Todostatus.not_started}, message = "{TODO.todostatus.insert}", grupos = {c.insert.class, s.Insert.class})} " TODostatus.completed}, message = "{tdo.todostatus.update}", grupos = {c.update.class, s.update.class}) private Todostatus Todostatus;Anotações personalizadas
@Documentado@restrint (validatedby = {TODostatusValid.todostatusValidFactory.class})@Target ({ElementType.Field, ElementType.annotation_type, elementType.Parameter})@retention.Runtime) @repetable (dameter})@retention.Runtime) @repeatable (dameter})@retention.Runtime) @repeatable (dameter})@retention.Runtime) @repetable (dameter}) {String message () padrão "Por favor, digite o status correto"; Todostatus [] enums () padrão {}; Classe <?> [] Grupos () padrão {}; Classe <? estende a carga de pagamento> [] Payload () padrão {}; classe TODOSTATUSVALIDFFACTORY REMBRAINTVELIDADOR <TODOSTATUSVALID, TODOSTATUS> {private Todostatus [] enums; @Override public void Initialize (TODOSTATUSVALID TODOSTATUSVALID) {this.enums = TODostatusValid.enums (); } @Override public boolean isValid (valor de TODOSTATUS, CONTEXTO RESTRAIRVALIDATORCONTEXT) {TODOSTATUS [] valores = TODOSTATUS.VALUES (); if (enums! = null && enums.length! = 0) {valores = enums; } if (Arrays.asList (valores) .Contains (value)) retorna true; retornar falso; }} @Target ({elementType.field, elementType.annotation_type, elementType.parameter}) @retention (retentionPolicy.Runtime) @Documented @Interface List {ToDostatusValid [] value (); }}Resumir
O exposto acima é o que o editor introduzido no Springboot usa o JSR 303 para verificar a camada de controle do controlador e a verificação da camada de serviço da camada de serviço. Use arquivos de recursos da mensagem para internacionalizar mensagens. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!