定制球衣 class 会员注入异常
Custom jersey class member injection exception
我已经创建了一个自定义的可注射供应商,我已经尝试了两种方法:
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();
}
}
我确保将此 class 添加到我的资源配置中:
final ResourceConfig resourceConfig = new DefaultResourceConfig(PrincipleInjectableProvider.class);
在我的 REST 资源中,我尝试像这样注入 class:
@Context
private Principal _principal;
我最初计划使用一个名为 @Principal 的单独注释,但我现在决定让这项工作生效。
当我尝试将其作为方法参数注入时,它成功了(对可注入的 class 进行了一些更改以实现
InjectableProvider<Context, Parameter>
改为)
但我似乎无法将其作为 class 成员注入..
这是我收到的异常消息:
Missing dependency for field: private com.....principal.Principal com.....net.TestResource._principal
我浏览了所有其他相关的帖子,但找不到解决方案。大多数已通过更改
得到修复
InjectableProvider<Context, Parameter>
到
InjectableProvider<Context, Type>
请帮我找出我做错了什么,
我试过球衣 1.12 和 1.18。
最后我发现我的问题是我们的资源是单例的,因此这些按请求可注入的提供程序无法工作。
相反,我实现了一个 signleton 可注入提供程序,其工作方式类似于 @Context 的工作方式,具有代理和本地线程。
我已经创建了一个自定义的可注射供应商,我已经尝试了两种方法:
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();
}
}
我确保将此 class 添加到我的资源配置中:
final ResourceConfig resourceConfig = new DefaultResourceConfig(PrincipleInjectableProvider.class);
在我的 REST 资源中,我尝试像这样注入 class:
@Context
private Principal _principal;
我最初计划使用一个名为 @Principal 的单独注释,但我现在决定让这项工作生效。
当我尝试将其作为方法参数注入时,它成功了(对可注入的 class 进行了一些更改以实现
InjectableProvider<Context, Parameter>
改为)
但我似乎无法将其作为 class 成员注入..
这是我收到的异常消息:
Missing dependency for field: private com.....principal.Principal com.....net.TestResource._principal
我浏览了所有其他相关的帖子,但找不到解决方案。大多数已通过更改
得到修复InjectableProvider<Context, Parameter>
到
InjectableProvider<Context, Type>
请帮我找出我做错了什么, 我试过球衣 1.12 和 1.18。
最后我发现我的问题是我们的资源是单例的,因此这些按请求可注入的提供程序无法工作。 相反,我实现了一个 signleton 可注入提供程序,其工作方式类似于 @Context 的工作方式,具有代理和本地线程。