2013-11-23 41 views
0

我正在使用GF4进行bean验证。我正在尝试在我的自定义验证程序中使用@Inject服务bean,但我获得了null值。自定义bean验证不会`@ inject` CDI bean并且不会插入消息?

public class TestValidator implements ConstraintValidator<>{ 
    @Inject Service myService; 
} 

这是不是假设使用JEE7?

此外,我试图找到内置的动态消息插值(无需编写我自己的MessageInterpolator)。我确实看到了一些例子,但它们不是很清楚。我正在寻找的是从ConstraintValidator.isValid传递动态参数。例如:

Message_test = {值}无效

而不知何故编织此,以相同的方式,你可以静态例如内插Annotation值size_msg = {min} - {max}超出范围。

回答

1

是的,通常,Java EE 7/Bean Validation 1.1应该可以向验证程序注入依赖项。

如何执行验证以及如何获取Validator对象?请注意,DI仅适用于容器管理的验证器,即通过@Inject或JNDI查找检索的验证器。如果您使用BV引导程序API自行引导验证程序,则此验证程序不会启用CDI。

关于消息插值,可以使用${validatedValue}参考已验证的值。如果你正在使用Hibernate验证5.1.0.Alpha1或更高版本的工作,那么你也有the possibility将更多的对象从ConstraintValidator#isValid()这样的范围内添加到消息上下文:

public boolean isValid(Date value, ConstraintValidatorContext context) { 
    Date now = GregorianCalendar.getInstance().getTime(); 

    if (value.before(now)) { 
     HibernateConstraintValidatorContext hibernateContext = 
       context.unwrap(HibernateConstraintValidatorContext.class); 

     hibernateContext.disableDefaultConstraintViolation(); 
     hibernateContext.addExpressionVariable("now", now) 
       .buildConstraintViolationWithTemplate("Must be after ${now}") 
       .addConstraintViolation(); 

     return false; 
    } 

    return true; 
} 
+0

谢谢您的回答。我正在使用'@Named @ ApplicationScoped'来定义我的服务。验证是通过JSF 2.2触发的,所以我认为它会通过CDI加载。在我的验证器中,我使用'@ Inject'来引用我的服务bean。 就hibernate而言,我不想将我的应用程序耦合到任何实现。 –

+0

我设法解决了这个问题。如果在JSF bean上设置了验证注解,则该服务被正确注入。如果在JPA bean上设置了验证注解,那么它不是。我认为这是正常的,因为服务被定义为'@ Named/@ ApplicationScoped',所以它们在休眠CDI上下文中不可用。 –