public class ServiceBinder<T> extends AbstractBinder
{
private final Factory<T> _factory;
private final Class<? extends T> _clazz;
public OsgiServiceBinder(Class<T> clazz)
{
_factory = new ServiceFactory<>(clazz);
_clazz = clazz;
}
protected void configure()
{
bindFactory(_factory).to(_clazz); //.in(RequestScoped.class);
bind(ServiceInjectionResolver.class)
.to(new TypeLiteral<InjectionResolver<Context>>() { })
.in(PerLookup.class);
}
}
public class ServiceInjectionResolver<T> implements InjectionResolver<Context>
{
private Class<T> _clazz;
public OsgiServiceInjectionResolver(Class<T> clazz)
{
_clazz = clazz;
}
public Object resolve(Injectee injectee, ServiceHandle<?> root)
{
if (_clazz.getCanonicalName().equals(injectee.getRequiredType().getTypeName())) {
return Framework.getService(_clazz);
}
return null;
}
public boolean isConstructorParameterIndicator()
{
return false;
}
public boolean isMethodParameterIndicator()
{
return true;
}
}
public class MyApplication extends Application
{
public MyApplication()
{
registerClasses(<resource classes>);
register(new ServiceBinder<>(MyService.class));
}
}
@Path("/schedules")
public class SchedulesResource
{
@Context UriInfo _uriInfo;
// This injection works fine, _service1 is properly initialized
@Context MyService _service1;
@PUT
@Consumes({MediaType.APPLICATION_JSON})
@Path("{jobGroup}/{jobName}")
public Response putSchedule(@Context MyService service2,
...)
{
// The injection of service2 doesn't work...
}
}
public class ServiceFactory<T> implements Factory<T>
{
private Class<T> _clazz;
protected ServiceFactory(Class<T> clazz)
{
_clazz = clazz;
}
public T provide()
{
return Framework.getService(_clazz);
}
}
public void dispose(T t)
{
}
}
Pok
问题实际上是泽西岛组件注册。即使我在注册绑定实例,Jersey也在检查类(ServiceBinder)并丢弃除第一个注册之外的所有注册(警告:找到该类型的现有注册)。
考虑到我正在注册实例,这似乎有点虚假,我希望Jersey在注册组件失败时出现错误而不是记录一个警告,但解决方案是只需稍微更改注册模式:
// Doesn't work
register(new ServiceBinder<>(MyService1.class));
register(new ServiceBinder<>(MyService2.class));
// Works like a charm
register(new ServiceBinder(MyService1.class, MyService2.class));
其中ServiceBinder显然被调整为对每个提供的服务调用bindFactory。
问题内容: 我只是熟悉使用JAX-RS在Java中实现REST Web服务,因此遇到了以下问题。我的资源类之一要求访问存储后端,该后端在接口后被抽象化。我想将当前实例注入到服务REST请求的资源类中,并且我认为这样做的一种好方法是使用批注和适当的类。这是我到目前为止所拥有的: 在: 在: 我用来自动发现提供程序和资源类,并且根据日志,它很好地拾取了该类(故意遗漏了时间戳和不必要的内容): 但是,资
问题内容: 我在下面有这样的设置。这是一个简化的版本,但我认为它已涵盖了基本思想。我正在使用Jersey 2.16,Java 1.8和Glassfish Open Source 4.1 但是,当我部署并尝试访问Web服务时,我从安全上下文中得到了NullPointer异常。似乎根本没有注入上下文。我检查了这是secContext变量本身,而不仅仅是从getUserPrincipal()返回的nul
我正在开发一个安全的web应用程序,它可以进行金融交易,并在其中使用spring。哪个更适合用于安全性、JAX-RS服务或SpringREST服务?我考虑使用spring,因为我们已经在应用程序中使用它了,如果它提供了功能,那么为什么要使用JAX-RS,但正如我所说的,它是一个高度安全的web应用程序,人们将在其中购买东西并进行金融交易,所以我必须看看哪个更适合使用。 我看了下面的博客还是有点困惑
所以我使用的是与JBoss捆绑在一起的RESTEasy。 类是: …最后,在类中,我有以下内容: 我的问题是: 为什么注射失败? 我有点厌倦了注释魔术在运行时失败,有没有一种方法可以不使用注释就获得? 或者,我的类是否可以获得并将其作为构造函数参数传递给类? 如果所有其他方法都失败了,我想我总是可以使用?自己读取和解析web.xml文件
前一部分介绍 @Context 的使用。第5章描述了 JAX-RS 的所有标准的JAX-RS Java类型,可以使用 @Context。 当 JAX-RS 应用程序使用 servlet ,那么 ServletConfig 、ServletContext 、HttpServletRequest 和 HttpServletResponse,是可用 @Context 。
问题内容: 我从 JavaEE 6中 了解到,它是可选的。 因此,如果没有 web.xml ,如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现? 问题答案: 就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您在子类上使用注释。 有关部署选项的更多信息,请参见JAX-RS规范-> 2.3发布-> 2.3.2Servlet。 或更常