您如何初始化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感觉更干净。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)