我遇到了一个奇怪的行为,我没有设法解释,在一个带有由Spring管理的DI的Jersey类中注入验证器。
扼杀这种情况:
我使用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消息插值器的验证器... < / p>
@Autowired
private Validator validator; // OK
@Inject
private Validator validator; // KO
@Inject
private OtherService otherService; // OK
你能解释一下这里发生了什么吗?
据我所知,与Jersey捆绑在一起的依赖注入实现是HK2,但是jersey-spring插件应该是HK2和Spring之间的桥梁,我一定错过了一些东西,因为它们似乎完全分离了,我认为:
顺便说一句,我完全能够使用@Inject注释注入我的其他Spring服务,这就是为什么我会失去理智并且不知道该怎么想。 ..唯一有问题的bean似乎就是这个Validator。
我还尝试使用@Valid注释来验证我的bean而不必注入验证器,问题是一样的:Jersey使用来自Hibernate Validator的默认验证器......
经过大量的时间,我找到了一种方法来修复@Valid问题,方法是创建一个ContextResolver Provider来修改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;
}
}
现在泽西岛使用了一个带有我的消息插值器的验证器,但我仍然试图理解为什么我无法在泽西岛类中使用@Inject注释注入它!
感谢您的帮助