JSR303验证程序注入,在Jersey类中使用Spring
我遇到了一个我没有解释的奇怪行为,在一个Jersey类中使用Spring管理的DI进行了验证程序注入 总结一下情况: 我使用jeysey2和spring4使用jax-rs规范生成restweb服务,并使用jsr303bean验证注释验证bean。bean验证实现是Hibernate验证程序,捆绑在jersey bean验证依赖项中 这是我的POM: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.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
经过很多时间,我找到了一种解决@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;
}
}