JSR 303验证程序注入Spring中的Jersey类

我遇到了一个奇怪的行为,我没有设法解释,用Spring管理的DI中的验证器注入。

为了避免这种情况:

我使用Jeysey 2和Spring 4使用jax-rs规范生成REST Web服务,并且使用jsr303 bean验证注释验证bean。 Bean验证实现是Hibernate Validator,捆绑在jersey-bean-validation依赖中。

这是我的POM:

<jersey.version>2.26-b07</jersey.version>
...
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring4</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-bean-validation</artifactId>
    <version>${jersey.version}</version>
</dependency>

在我的spring配置中,我声明了一个Validator bean(带有一个自定义消息插入器来检索数据库中的错误消息),稍后我将在我的Web服务类中注入它:

@Bean
public Validator getValidator(MessageInterpolator messageInterpolator){
    return Validation.byDefaultProvider().configure()
            .messageInterpolator(messageInterpolator)
            .buildValidatorFactory()
            .getValidator();
}

此时,我可以使用@Autowired注释在Jersey类中注入我的验证器,但不能使用jsr 330 @Inject注释来注入另一个验证器和默认的Hibernate Validator消息插值器。

@Autowired
private Validator validator; // OK

@Inject
private Validator validator; // KO

@Inject
private OtherService otherService; // OK

你能解释我发生了什么吗?

我明白与泽西捆绑在一起的依赖注入实现是HK2,但泽西泉插件应该做HK2和Spring之间的桥梁,我一定错过了一些东西,因为它们看起来完全分离,我认为:

  • @Autowired使用Spring并注入我定义的bean
  • @Inject使用不知道该bean的HK2,并注入Hibernate Validator项目中找到的那个...
  • 顺便说一下,我完全能够使用@Inject注释注入我的其他Spring服务,这就是为什么我放松主意,不知道该怎么想......唯一有问题的bean似乎是这个Validator。

    我也尝试使用@Valid注释来验证我的bean,而不必注入验证器,问题是一样的:Jersey使用Hibernate Validator的默认验证器...


    经过许多时间,我找到了一种方法来解决@Valid问题,方法是创建一个ContextResolver提供程序,使用我的自定义消息插值器来修改Jersey默认配置:

    @Provider
    public class ValidationConfigContextResolver implements ContextResolver<ValidationConfig> {
    
        private final MessageInterpolator messageInterpolator;
    
        @Inject
        public ValidationConfigContextResolver(MessageInterpolator messageInterpolator) {
            this.messageInterpolator = messageInterpolator;
        }
    
        @Override
        public ValidationConfig getContext(Class<?> aClass) {
            final ValidationConfig config = new ValidationConfig();
            config.messageInterpolator(messageInterpolator);
            return config;
        }
    
    }
    

    现在Jersey使用验证器与我的消息插值器,但我仍然试图了解为什么我无法在Jersey类中使用@Inject注释注入它!

    感谢您的帮助

    链接地址: http://www.djcxy.com/p/82029.html

    上一篇: JSR 303 Validator injection with Spring in Jersey classes

    下一篇: How to inject spring bean into Validator(hibernate)