当前位置: 首页 > 知识库问答 >
问题:

JAX-RS@Context在Jersey 2和Jersey 1中的使用情况比较

钮誉
2023-03-14
    null
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

共有1个答案

禹昊穹
2023-03-14

问题实际上是泽西岛组件注册。即使我在注册绑定实例,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。 或更常