自定义球衣类成员注入异常

时间:2015-01-19 22:05:17

标签: java jersey

我创建了一个自定义注射提供者,我尝试了两种方法:

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。

1 个答案:

答案 0 :(得分:0)

最后我发现我的问题是我们的资源是单身人士,所以这些每个请求的注射服务提供者都无法工作。 相反,我实现了一个signleton可注射提供程序,它与@Context的工作方式类似,代理和线程本地。