球衣:InjectableProvider未领取-春季

球衣:InjectableProvider未领取-春季,第1张

球衣:InjectableProvider未领取-春季

您如何初始化Jersey?

我假设您正在使用Jersey-spring Servlet使用Jersey。在这种情况下,Jersey将默认使用Spring
Bean进行初始化,因此您

Provider
必须是Spring Bean。尝试在中添加一个
@Named
(或如果不使用atinject
@Component
或Spring注释之一)
Provider

使用Injectable Providers的示例。


更新 :注射范围更清晰:

Provider
必须是一个Singleton,因为出于所有实际目的,它是一个与范围相关联的工厂,因此无需为每个请求都构造一个工厂。注入本身将根据请求进行。换句话说,
getInjectable
将为每个请求调用该方法。您有机会尝试吗?

OTOH,如果扩展

SingletonTypeInjectableProvider
相同的对象,则每次都会将其注入资源中。

我不确定我是否完全理解您的

Provider
实现。我相信类似以下的方法应该起作用。

public class UserProvider extends PerRequestTypeInjectableProvider<AttributeParam, Users>{    public UserProvider(){        super(Users.class);    }    @Context    HttpServletRequest request;    @Override    public Injectable<Users> getInjectable(ComponentContext cc, AttributeParam a) {        String attributevalue = AnnotationUtils.getValue(a);        return new Injectable<Users>(){ public Users getValue() {     System.out.println("Called"); //This should be called for each request     return request.getAttribute(attributevalue); }        };    }}

已更新 :提供有关Jersey可用注射类型和上下文的更多信息。

正如您现在可能已经想到的那样,如果

HttpServletRequest
仅需要访问,则直接将其注入到您的文档中
Resource
Provider
使用
@Context
注释即可得到。

但是,要将这些值传递给Injectable必须使用

AssistedProvider
或使用与您相似的方法。但是,如果您
Injectable
在Provider中内联定义并将其注入
HttpServletRequest
Provider
类中,则可以再次缓解这种情况。在那种情况下,
Injectable
它将能够访问
HttpServletRequest
实例(因为它在范围内)。我刚刚更新了示例以显示该方法。

使用

PerRequestTypeInjectableProvider
SingletonTypeInjectableProvider
并不是唯一将值注入资源的两个选项。您还可以使用
*Param
值注入值
StringReaderProvider
。显然,这种注入是请求范围内的。

@Provider@Named("userProviderParamInjector")public class UserProviderParam implements StringReaderProvider<Users> {    @Context    HttpServletRequest request;    public StringReader<Users> getStringReader(Class<?> type, Type type1, Annotation[] antns) {        if(type.equals(Users.class) {return null;        }        String attributevalue = null;        for(Annotation a : antns) { if((a.getClass().getSimpleName()).equals("AttributeParam")){    attributevalue = (String)AnnotationUtils.getValue(a); }        }        return new StringReader<Users>(){ public Users fromString(String string) {     // Use the value of the *Param or ignore it and use the attributevalue of our custom annotation.     return request.getAttribute(attributevalue); }        };    }}

Provider
对于
*Param
资源中拥有的任何资源,将调用此方法。因此,使用
Provider
上面注册的资源和下面注册的资源,该
Users
值将注入到您的资源方法中。

@Path("/user/")@Namedpublic class UserResource {    @Path("{id}")    @GET    @Produces(MediaType.APPLICATION_JSON)    public Result<Users> get(@AttributeParam("foo") @PathParam("id") Users user) {    ...    }}

但老实说,我认为这是对StringReaderProvider合同的滥用,而以前的使用技巧

Injectable
感觉更干净。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5439932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存