Spring ConstraintValidator中的注入服务[Bean Validator

编程入门 行业动态 更新时间:2024-10-25 17:20:47
本文介绍了Spring ConstraintValidator中的注入服务[Bean Validator-JSR 303] Spring的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

下午好,

我在将服务插入Bean验证程序(JSR 303)时遇到问题.我将执行验证,但是我需要验证数据库中的该记录;

I am having problem to inject a service within a Bean Validator (JSR 303). I would be performing a validation, but I need to validate this record in my database;

当我使用我的服务时,它会抛出NullPointerException;

When I use my service it throws NullPointerException;

例外:

Exception in thread "main" javax.validation.ValidationException: HV000028: Unexpected exception during isValid call. at org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:294) at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:164) at org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:125) at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:86) at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:442) at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:387) at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:351) at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:303) at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:133) at net.pontoall.hemisphere.core.validation.impl.TesteValidator.main(TesteValidator.java:25) Caused by: java.lang.NullPointerException at net.pontoall.hemisphere.core.validation.impl.UsuarioValidatorImpl.doCheckLogin(UsuarioValidatorImpl.java:48) at net.pontoall.hemisphere.core.validation.impl.UsuarioValidatorImpl.isValid(UsuarioValidatorImpl.java:26) at net.pontoall.hemisphere.core.validation.impl.UsuarioValidatorImpl.isValid(UsuarioValidatorImpl.java:1) at org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:291) ... 9 more

注释:

@Target(value = ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = UsuarioValidatorImpl.class) public @interface UsuarioValidator { String message() default "{net.pontoall.hemisphere.validation.UsuarioValidator.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

ValidatorImpl:

ValidatorImpl:

public class UsuarioValidatorImpl implements ConstraintValidator<UsuarioValidator, Usuario> { @Autowired private IUsuarioService service; @Override public void initialize(UsuarioValidator arg0) { } @Override public boolean isValid(Usuario entidade, ConstraintValidatorContext ctx) { try { return (this.doCheckLogin(entidade, ctx) && this.doCheckEmail(entidade, ctx)); } catch (HemisphereException e) { e.printStackTrace(); return false; } } private boolean doCheckLogin(Usuario entidade, ConstraintValidatorContext ctx) throws HemisphereException { ctx.buildConstraintViolationWithTemplate("{net.pontoall.hemisphere.validation.UsuarioValidator.login.message}").addConstraintViolation(); if (entidade.getId() == null) { // Novo Usuário Usuario original = service.buscarPorLogin(entidade.getLogin()); if (original == null) { return true; } return false; } else { Usuario original = service.obter(entidade.getId()); if (original == null) { return true; } else { if (original.getLogin().equals(entidade.getLogin()) && original.getId().equals(entidade.getId())) { return true; } } return false; } } private boolean doCheckEmail(Usuario entidade, ConstraintValidatorContext ctx) { ctx.buildConstraintViolationWithTemplate("{net.pontoall.hemisphere.validation.UsuarioValidator.email.message}").addConstraintViolation(); if (entidade.getId() == null) { // Novo Usuário Usuario original = service.buscarPorEmail(entidade.getEmail()); if (original == null) { return true; } return false; } else { Usuario original = service.obter(entidade.getId()); if (original == null) { return true; } else { if (original.getEmail().equals(entidade.getEmail()) && original.getId().equals(entidade.getId())) { return true; } } return false; } } }

推荐答案

您应该设置 LocalValidatorFactoryBean 在您的Spring应用程序上下文中,以便您可以通过依赖注入来检索Validator(和ValidatorFactory)实例.

You should set up a LocalValidatorFactoryBean in your Spring application context so you can retrieve Validator (and ValidatorFactory) instances via dependency injection.

默认情况下,像Pangea所指出的那样,使用SpringConstraintValidatorFactory这样获得的验证器将为约束验证器实现提供依赖注入服务.

By default, a validator obtained like that makes use of SpringConstraintValidatorFactory which provides dependency injection services to constraint validator implementations, as pointed out by Pangea.

更多推荐

Spring ConstraintValidator中的注入服务[Bean Validator

本文发布于:2023-10-07 17:27:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1470024.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ConstraintValidator   Spring   Validator   Bean

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!