我一直在寻找几个小时来解决我的问题,但我无法让它发挥作用。我想将我的 Weld 托管服务注入到 ConstraintValidator 中,该 ConstraintValidator 用于验证发布到我的 JAX-RS Rest-Service 的用户对象。一切都部署到 glassfish 4.1 服务器。
我有这样的服务
@ApplicationScoped
public class UserService {
}
我想将它注入这样的 ConstraintValidator
public class UniqueUserNameValidator implements ConstraintValidator<UniqueUserName, ApiUser> {
@Inject
private UserService service;
@Override
public void initialize(UniqueUserName constraintAnnotation) {
}
@Override
public boolean isValid(ApiUser value, ConstraintValidatorContext context) {
return service.getByUserName(value.getUserName()) == null;
}
}
REST 资源看起来像这样
@Path("users")
@Produces(MediaType.APPLICATION_JSON)
public class UserResource {
@Inject
UserService userService;
@POST
public Response createUser(@Valid ApiUser apiUser) {
ApiRepresentation created = userService.create(apiUser);
return Response.created(createURL(created)).build();
}
}
当我发布一个 json 用户对象时,我得到以下异常:
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=UserService,parent=UniqueUserNameValidator,qualifiers={},position=-1,optional=false,self=false,unqualified=null,173822971)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:947)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:902)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:977)
at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:968)
at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:173)
我知道球衣使用 hk2 作为 DI 提供程序,并且 ConstraintValidator 是使用 InjectingConstraintValidatorFactory 创建的,而 InjectingConstraintValidatorFactory 作为回报使用 ResourceContext。由于 HK2 对我的 WELD 容器托管 bean 一无所知,因此在创建 ConstraintValidator 时无法注入正确的服务。
为了解决这个问题,我正在寻找
a) 一种为 JAX-RS(最好是不依赖球衣的纯 JAX-RS 方式)提供自定义 ConstraintValidatorFactory 以创建验证器的方法。
或 b) 强制 jersey 使用 WELD 作为 DI 提供者或告诉 hk2 拾取所有容器管理的 bean 而无需手动将每个 bean 添加到 hk2 的方法。我不知道如何使用这里提出的桥。
我很感激任何帮助。
干杯