AEM 6.5 @Reference(target = "(component.name=componentName)") 不工作
AEM 6.5 @Reference(target = "(component.name=componentName)") Not working
我正在尝试使用 @Reference
注释的 target
属性 注入 AEM 组件。
这是我要注入的组件。
import org.osgi.service.component.annotations.Component;
import okhttp3.Interceptor;
@Component(immediate = true, name = "myInterceptorComponent", service = {Interceptor.class})
public class myInterceptor implements Interceptor {
public static final String COMPONENT_NAME = "myInterceptorComponent";
//... some implementation
}
这是使用它的组件是:
import okhttp3.Interceptor;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(immediate = true)
public final class anotherComponent {
@Reference(target = "(component.name=myInterceptorComponent)")
private Interceptor myInterceptor;
//... another implementation
}
这是我正在测试的 运行ning:
@ExtendWith({AemContextExtension.class})
class anotherComponent Test {
private final AemContext context = AppAemContext.newAemContext();
@BeforeEach
public void setUp() {
this.context.registerInjectActivateService(myInterceptor.class);
this.context.registerInjectActivateService(anotherComponent.class);
}
@Test
void testMethod(){
//Test implementation
}
}
当我 运行 测试时,出现此错误:
org.apache.sling.testing.mock.osgi.ReferenceViolationException: Unable to inject mandatory reference 'myInterceptor' for class com.test.anotherComponent : no matching services were found.
如果我使用 @Reference
引用组件而不使用 target
属性,则测试有效。不幸的是,我有不止一个拦截器,component.name
属性 让我区分它们。
关于失败原因的任何想法?
注册服务时需要传递额外的配置来指定目标名称。
在你的情况下是这样的:
this.context.registerInjectActivateService(new MyInterceptor(), Collections.singletonMap("component.name", "myInterceptorComponent"));
我正在尝试使用 @Reference
注释的 target
属性 注入 AEM 组件。
这是我要注入的组件。
import org.osgi.service.component.annotations.Component;
import okhttp3.Interceptor;
@Component(immediate = true, name = "myInterceptorComponent", service = {Interceptor.class})
public class myInterceptor implements Interceptor {
public static final String COMPONENT_NAME = "myInterceptorComponent";
//... some implementation
}
这是使用它的组件是:
import okhttp3.Interceptor;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(immediate = true)
public final class anotherComponent {
@Reference(target = "(component.name=myInterceptorComponent)")
private Interceptor myInterceptor;
//... another implementation
}
这是我正在测试的 运行ning:
@ExtendWith({AemContextExtension.class})
class anotherComponent Test {
private final AemContext context = AppAemContext.newAemContext();
@BeforeEach
public void setUp() {
this.context.registerInjectActivateService(myInterceptor.class);
this.context.registerInjectActivateService(anotherComponent.class);
}
@Test
void testMethod(){
//Test implementation
}
}
当我 运行 测试时,出现此错误:
org.apache.sling.testing.mock.osgi.ReferenceViolationException: Unable to inject mandatory reference 'myInterceptor' for class com.test.anotherComponent : no matching services were found.
如果我使用 @Reference
引用组件而不使用 target
属性,则测试有效。不幸的是,我有不止一个拦截器,component.name
属性 让我区分它们。
关于失败原因的任何想法?
注册服务时需要传递额外的配置来指定目标名称。 在你的情况下是这样的:
this.context.registerInjectActivateService(new MyInterceptor(), Collections.singletonMap("component.name", "myInterceptorComponent"));