Spring Boot с Jax-RS с Open Tracer получает исключение UnsatisfiedDependencyException - PullRequest
0 голосов
/ 21 января 2020

Пружинная загрузка, Jax-RS + Open Tracer

В моих учетных записях:

   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")  // <---

Проблема начинается, когда я пытаюсь ввести Tracer:

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

Я попробовал несколько способов добавить транс:

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);
  }
}

Затем добавьте его в:

    @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 работал нормально перед добавлением открытых tracing dep.

Q: Есть идеи, как заставить это работать? Чтобы иметь возможность вводить Tracer.

1 Ответ

0 голосов
/ 21 января 2020

Хорошо. Я сделал следующее:

  1. заменил все мои переименованные весенние аннотации @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());

Тогда я мог видеть, что объект трассировки был введен. (не уверен, что этот Tracer - то, что мне нужно, я вижу, что он возвращает "" в качестве идентификатора трассировки. Но я думаю, это другой вопрос.)

Пожалуйста, не стесняйтесь, чтобы найти лучшее решение .


Возможно, я бы сказал: если нет ограничений: используйте либо пружину / контроллер, либо не пружину + jax-rs.

...