JSR303验证程序注入,在Jersey类中使用Spring

JSR303验证程序注入,在Jersey类中使用Spring,spring,dependency-injection,jersey-2.0,bean-validation,hibernate-validator,Spring,Dependency Injection,Jersey 2.0,Bean Validation,Hibernate Validator,我遇到了一个我没有解释的奇怪行为,在一个Jersey类中使用Spring管理的DI进行了验证程序注入 总结一下情况: 我使用jeysey2和spring4使用jax-rs规范生成restweb服务,并使用jsr303bean验证注释验证bean。bean验证实现是Hibernate验证程序,捆绑在jersey bean验证依赖项中 这是我的POM: <jersey.version>2.26-b07</jersey.version> ... <dependency&g

我遇到了一个我没有解释的奇怪行为,在一个Jersey类中使用Spring管理的DI进行了验证程序注入

总结一下情况:

我使用jeysey2和spring4使用jax-rs规范生成restweb服务,并使用jsr303bean验证注释验证bean。bean验证实现是Hibernate验证程序,捆绑在jersey bean验证依赖项中

这是我的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>
此时,我可以使用@Autowired注释在Jersey类中插入我的验证器,但不能使用JSR330@inject注释,它使用默认的Hibernate验证器消息插值器插入另一个验证器

@Autowired
private Validator validator; // OK

@Inject
private Validator validator; // KO

@Inject
private OtherService otherService; // OK
你能解释一下这里发生了什么事吗

我知道Jersey附带的依赖注入实现是HK2,但是Jersey spring插件应该是HK2和spring之间的桥梁,我一定错过了什么,因为它们看起来完全分离了,我认为:

  • @Autowired使用Spring并注入我定义的bean
  • @使用不知道该bean的HK2注入,并注入在Hibernate验证程序项目中找到的那个bean
顺便说一句,我完全能够用@inject注释注入我的其他Spring服务,这就是为什么我现在心不在焉,不知道该怎么想。。。唯一有问题的bean似乎是这个验证器

我还尝试使用@Valid注释来验证我的bean,而不必注入验证器,问题是相同的:Jersey使用Hibernate validator的默认验证器


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

@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;
    }

}
@Provider
公共类验证ConfigContextResolver实现ContextResolver{
专用最终消息插入器消息插入器;
@注入
公共验证ConfigContextResolver(MessageInterpolator MessageInterpolator){
this.messageInterpolator=messageInterpolator;
}
@凌驾
public ValidationConfig getContext(类aClass){
final ValidationConfig=new ValidationConfig();
config.messageInterpolator(messageInterpolator);
返回配置;
}
}
现在Jersey在我的消息插值器中使用了一个验证器,但我仍在试图理解为什么我不能在Jersey类中使用@inject注释来注入它


感谢您的帮助

我也遇到了这个问题,您使用的是哪种版本的球衣?我最终只是在Jersey控制的类中使用了
@Autowired
。嗨,我使用的是Jersey 2.26-b07版本。这似乎是一个测试版处理Spring4Bridge。但是我在stable Jersey版本和Spring 3上遇到了同样的问题。我还没有测试,但很可能是因为HK2服务优先于@Inject。您可以通过将OtherService设置为HK2服务来轻松测试它。看看哪一个被注射了Hanks我来测试一下!但是你知道这个先例是如何定义的吗?我也有这个问题,你用的是哪个版本的球衣?我最终只是在Jersey控制的类中使用了
@Autowired
。嗨,我使用的是Jersey 2.26-b07版本。这似乎是一个测试版处理Spring4Bridge。但是我在stable Jersey版本和Spring 3上遇到了同样的问题。我还没有测试,但很可能是因为HK2服务优先于@Inject。您可以通过将OtherService设置为HK2服务来轻松测试它。看看哪一个被注射了Hanks我来测试一下!但是你知道这个先兆是如何定义的吗?
@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;
    }

}