java - 使用 Jax-RS 和 Open Tracer 的 Spring Boot 出现 UnsatisfiedDependencyException

标签 java spring-boot jax-rs hk2 opentracing

Spring boot,Jax-RS + Open Tracer

在我的 gradle 部门中:

   plugins {
       id 'java'
       id 'org.springframework.boot' version '2.2.2.RELEASE'
       id "io.spring.dependency-management" version "1.0.8.RELEASE"
    }

    implementation("org.springframework.boot:spring-boot-starter-jersey") ...
    implementation("io.opentracing.contrib:opentracing-jaxrs2-discovery:1.0.0")  // <---

当我尝试注入(inject)示踪剂时,问题就开始了:

@Path("/my)
@Produces(MediaType.APPLICATION_JSON)
public class MyResource { ...
    @Inject
    Tracer tracer;

我尝试了几种方法来添加 Trance:

https://github.com/opentracing-contrib/java-jaxrs

我最后尝试的是:(我也尝试过@WebListener)

@Provider
public class TracingInitializer implements DynamicFeature {

  private final ServerTracingDynamicFeature serverTracingDynamicFeature =
      new ServerTracingDynamicFeature.Builder(GlobalTracer.get())
          .withOperationNameProvider(ClassNameOperationName.newBuilder())
      .build();

  @Override
  public void configure(ResourceInfo resourceInfo, FeatureContext context) {
    serverTracingDynamicFeature.configure(resourceInfo, context);
  }
}

然后将其注入(inject):

    @Named
    public final class JerseyConfig extends ResourceConfig { ...
           @Inject
           public JerseyConfig() {

register(TracingInitializer.class);

开始时我最终遇到了这个异常:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Tracer,parent=MyResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,124873055)

在添加开放跟踪部门​​之前,hk2' @Inject 工作正常。

问:知道如何让它发挥作用吗?能够注入(inject)示踪剂。

最佳答案

好的。我所做的是:

  1. 将我所有的重命名 spring @Service 注释替换为 @Named 注释。
  2. 添加了 GlobalTracerBinder 类:

--

 public class GlobalTracerBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(GlobalTracer.get()).to(Tracer.class);
    }

}
  • class JerseyConfig extends ResourceConfig {
  • 中注册它

    像这样:

    register(new GlobalTracerBinder());
    

    然后我可以看到跟踪器对象被注入(inject)了。 (不确定该 Tracer 是否是我需要的,我看到它返回“”作为跟踪 ID。但我想这是另一个问题。)

    请免费提供更好的解决方案。

    <小时/>

    可以说,我会说:如果不受限制:使用 spring/controller 或不使用 spring + jax-rs。

    关于java - 使用 Jax-RS 和 Open Tracer 的 Spring Boot 出现 UnsatisfiedDependencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59831190/

    相关文章:

    java - 不能消费内容类型-RestEasy

    java - 固定字符串长度添加空格和删除超出的字符

    java - DBsetup 后 Spring 数据不增加

    java - 未分类的MongoDbException : Command failed with error 10107 (NotMaster): 'not master' on server

    java - @Transactional proxyTargetClass 和 @Inherited

    java - Jersey Client 能否自动将 POJO 实体编码为 application/x-www-form-urlencoded,还是我需要编写自定义 MessageBodyWriter?

    java - J2EE 重定向到外部 URL

    java - 构建一个中间带有 UUID 的正则表达式以进行单元测试?

    java - 如何制作 RESTEasy 响应过滤器?

    jaxb - Jersey Jax-RS出现内存错误