我创建了一个自定义注射提供者,我尝试了两种方法:
1)
@Provider
public static final class PrincipleInjectableProvider extends PerRequestTypeInjectableProvider<Context, Principal>
{
public PrincipleInjectableProvider()
{
super(Principal.class);
}
@Override
public Injectable<Principal> getInjectable(final ComponentContext ic, final Context a)
{
return new AbstractHttpContextInjectable<Principal>() {
@Override
public Principal getValue(final HttpContext c)
{
return c.getRequest().getUserPrincipal();
}
};
}
}
2)
@Provider
public static final class PrincipleInjectableProvider extends AbstractHttpContextInjectable<Principal>
implements InjectableProvider<Context, Type>, Injectable<Principal>
{
@Override
public ComponentScope getScope()
{
return ComponentScope.PerRequest;
}
@Override
public Injectable<Principal> getInjectable(final ComponentContext ic, final Context a, final Type c)
{
return this;
}
@Override
public Principal getValue(final HttpContext c)
{
return c.getRequest().getUserPrincipal();
}
}
我确保将此类添加到我的资源配置中:
final ResourceConfig resourceConfig = new DefaultResourceConfig(PrincipleInjectableProvider.class);
在我的REST资源中,我尝试像这样注入类:
@Context
private Principal _principal;
我原本打算使用一个名为@Principal的单独注释,但我现在就会解决这个问题。
当我试图将其作为方法参数注入时,它是成功的(对注入类进行了一些更改,以实现
InjectableProvider<Context, Parameter>
代替)
但我似乎无法将其作为班级成员注入..
这是我收到的异常消息:
Missing dependency for field: private com.....principal.Principal com.....net.TestResource._principal
我浏览了所有相关的帖子,但在那里找不到解决方案。大多数是通过改变
来解决的InjectableProvider<Context, Parameter>
到
InjectableProvider<Context, Type>
请帮我找到我在这里做错了什么, 我试过用球衣1.12和1.18。
答案 0 :(得分:0)
最后我发现我的问题是我们的资源是单身人士,所以这些每个请求的注射服务提供者都无法工作。 相反,我实现了一个signleton可注射提供程序,它与@Context的工作方式类似,代理和线程本地。